"hello, debug window" в избранное  новое    подписка   модер. 
От: Кодт rsdn 
Дата: 29.11.03 15:24
Оценка:79 (10)
При отладке консольных программ (особенно — write only), очень неприятно, что они выводят текст в черное окошко, а не в окно отладчика. Приходится туда-сюда переключаться, ставить breakpoint на конец программы (чтобы не потерять результаты), и т.п.

Ниже — решение, позволяющее направлять вывод С++ных стримов в окно отладчика VC.

Итак.
1. Сначала научимся писать туда.
2. Затем создадим streambuf, который делает это.
3. Далее создадим ostream с этим буфером.
4. Наконец, научим cout писать в отладочное окно.

Подробности — ниже.
Перекуём баги на фичи!
Re: "hello, debug window" в избранное  новое    модер. 
От: Кодт rsdn 
Дата: 29.11.03 15:27
К>1. Сначала научимся писать туда.

#include <crtdbg.h>

namespace debug
{
  namepspace utility
  {
    template<class T>
    void dprintf(const char* fmt, T t)
    {
      _CrtDbgReport(_CRT_WARN,NULL,0,NULL, fmt, t);
    }

    inline void dprints(const char* s)
    {
      dprintf("%s", s);
    }
    inline void dprints(const wchar_t* s)
    {
      dprintf("%S", s);
    }
    inline void dprintc(char c)
    {
      dprintf("%c", c);
    }
    inline void dprintc(wchar_t c)
    {
      wchar_t s[2] = { c, 0 };
      dprints(s);
    }
  }//debug::utility
}//debug

Вместо _CrtDbgReport(), требующего дебаг-компиляции и линковки, можно использовать WinAPI-шную OutputDebugString.
#include <windows.h> // OutputDebugString
#include <malloc.h> // _alloca
#include <stdlib.h> // mbs <-> wcs

namespace debug
{
  namepspace utility
  {
#ifndef UNICODE
    void dprints(const char* s, int n=0)
    {
      OutputDebugStringA(s);
    }
    void dprints(const wchar_t* s, int n=1024)
    {
      wchar_t* buf;
      buf = alloca(n*sizeof(wchar_t)):
      mbstowcs(buf, s, 1024);
      dprints(buf);
    }
#else
    void dprints(const wchar_t* s, int n=0)
    {
      OutputDebugStringW(s);
    }
    void dprints(const char* s, int n=1024)
    {
      char* buf;
      buf = alloca(n):
      wcstombs(buf, s, 1024);
      dprints(buf);
    }
#endif

    void dprintc(char c)
    {
      char buf[2] = { c, 0 };
      dprints(buf, 2);
    }
    void dprintc(wchar_t c)
    {
      wchar_t buf[2] = { c, 0 };
      dprints(buf, 8); // а вдруг в текущей локали выбран utf-7 %)
    }
  }//debug::utility
}//debug
Перекуём баги на фичи!
Re: "hello, debug window" в избранное  новое    модер. 
От: Кодт rsdn 
Дата: 29.11.03 15:40
Здравствуйте, Кодт, Вы писали:

К>2. Затем создадим streambuf, который делает это.


Для этого перекроем 2 функции, которые отвечают за вывод строки и символа.
#include <streambuf>

namespace debug
{
  using namespace std;

  template<class E, class T=char_traits<E> >
  class basic_debugbuf : public basic_streambuf<E,T>
  {
  public:
    // Dinkumware STL для VC7
    typedef basic_debugbuf<_Elem, _Traits> _Myt;
    typedef basic_streambuf<_Elem, _Traits> _Mysb;
    typedef codecvt<_Elem, char, typename _Traits::state_type> _Cvt;

    typedef E char_type;
    typedef T traits_type;
    typedef typename T::int_type int_type;
    typedef typename T::pos_type pos_type;
    typedef typename T::off_type off_type;

  protected:
    virtual streamsize xsputn(char_type const* s, streamsize n)
    {
      dprints(s); // мы не без оснований полагаем, что s - это нуль-терминированная строка
    }
    virtual int_type overflow(int_type c = traits_type::eof())
    {
      if(c != traits_type::eof()) dprintc(c);
      return c;
    }
  };

  typedef basic_debugbuf<char> debugbuf;
  typedef basic_debugbuf<wchar_t> wdebugbuf;
}//namespace debug
Перекуём баги на фичи!
Re: "hello, debug window" в избранное  новое    модер. 
От: Кодт rsdn 
Дата: 29.11.03 15:46
К>3. Далее создадим ostream с этим буфером.

Делается элементарно.
#include <ios>
#include <iosfwd>

... не забудем включить код нашего debugbuf

namespace debug
{
  using namespace std;

  template<class E, class T=char_traits<E> >
  class basic_debugstream : public basic_ostream<E,T>
  {
  private:
    basic_streambuf<E,T>* oldbuf;
    basic_debugbuf<E,T> newbuf;
  public:
    basic_debugstream() : basic_ostream<E,T>(_Noinit)
    {
      oldbuf = rdbuf(&newbuf);
    }
    ~basic_debugstream()
    {
      rdbuf(oldbuf);
    }
  };

  typedef basic_debugstream<char> debugstream;
  typedef basic_debugstream<wchar_t> wdebugstream;

};//debug
Перекуём баги на фичи!
Re: "hello, debug window" в избранное  новое    модер. 
От: Кодт rsdn 
Дата: 29.11.03 15:54
К>4. Наконец, научим cout писать в отладочное окно.

Выполним ту же манипуляцию с rdbuf.
Используем паттерн scope guard.

#include <iostream>
#include <cassert>

... включим код debugbuf

namespace debug
{
  using namespace std;

  template<class E, class T=char_traits<E> >
  class basic_debugsentry
  {
    basic_ostream<E,T>* ostr;
    basic_streambuf<E,T>* oldbuf;
    basic_debugbuf<E,T> newbuf;
  public:
    basic_debugsentry(basic_ostream<E,T>* os) : ostr(os)
    {
      assert(os != NULL);
      oldbuf = os->rdbuf(&newbuf);
    }
    ~basic_debugsentry()
    {
      os->rdbuf(oldbuf);
    }
  };

  typedef basic_debugsentry<char> debugsentry;
  typedef basic_debugsentry<wchar_t> wdebugsentry;

  template<ostream* ostr, wostream* wostr>
  class debugsentry_streams
  {
    debugsentry cs;
    wdebugsentry ws;
  public:
    debugsentry_streams() : cs(ostr), ws(wostr) {}
  };

  typedef debugsentry_streams<cout,wcout> debugsentry_cout;
  typedef debugsentry_streams<clog,wclog> debugsentry_clog;
  typedef debugsentry_streams<cerr,wcerr> debugsentry_cerr;

};//debug
Перекуём баги на фичи!
Re: "hello, debug window" в избранное  новое    модер. 
От: Кодт rsdn 
Дата: 29.11.03 16:02
Наконец, пример использования.
#include "dbgout.h"

int main()
{
  cout << "hello, console." << endl;
  cdbg << "hello, debugger." << endl;

  debugsentry_cout guard__;

  cout << "hello, debugger" << endl;
}
Перекуём баги на фичи!
Re[2]: "hello, debug window" в избранное  новое    модер. 
От: Кодт rsdn 
Дата: 29.11.03 16:02
Маленькая добавка. Аналогично <iostream>.
namespace debug
{

  template<class E, class T=char_traits<E> >
  class basic_debugout
  {
  public:
    static basic_debugstream<E,T> instance;
  };

  template<class E, class T=char_traits<E> >
  basic_debugstream<E,T> basic_debugout<E,T>::instance;

  typedef basic_debugout<char> debugout;
  typedef basic_debugout<wchar_t> wdebugout;

  debugstream& cdbg = debugout::instance;
  debugstream& wcdbg = wdebugout::instance;

}//debug
Перекуём баги на фичи!
Re: мои три копейки.... в избранное  новое    модер. 
От: c-smilehttp://terrainformatica.com
Дата: 29.11.03 17:42
Оценка:7 (2) +1
Здравствуйте, Кодт, Вы писали:

Классно!

А вот мои три копейки в стиле kiss:

void dprintf(const char* fmt, ...)
{
  char buffer[2049]; buffer[0]=0;
  va_list args;
  va_start ( args, fmt );
  int len = _vsnprintf( buffer, 2048, fmt, args );
  va_end ( args );
  OutputDebugString(buffer);
}
Re[2]: мои три копейки.... в избранное  новое    модер. 
От: Alexey Shirshov rsdnhttp://wise-orm.com
Дата: 30.11.03 08:43
Здравствуйте, c-smile, Вы писали:

хъ

Про UNICODE забыл.
... << RSDN@Home 1.1.0 stable >>
Re[2]: мои три копейки.... в избранное  новое    модер. 
От: Зверёк Харьковский 
Дата: 30.11.03 10:28
Здравствуйте, c-smile, Вы писали:

CS>А вот мои три копейки в стиле kiss:


[зверьковыгрызено]

Андрей, kiss, он конечно и в африке kiss.
Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет.
Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же?
STL, конечно, можно сколько угодно считать suxx'ом, но вот весьма нелюбимая тобой концепция потока все же заслуживает уважения.

(не обижайся, если что )
FAQ — це мiй ай-кью!
Re: "hello, debug window" в избранное  новое    модер. 
От: Зверёк Харьковский 
Дата: 30.11.03 10:30
Здравствуйте, Кодт, Вы писали:

[зверьковыгрызено]
просто прелесть!
FAQ — це мiй ай-кью!
Re: "hello, debug window" в избранное  новое    модер. 
От: Nose 
Дата: 30.11.03 16:07
Здравствуйте, Кодт, Вы писали:

А у меня в чистом виде не работает... VC7.1
Ща буду копаться...
... << RSDN@Home 1.1.0 stable >>
Re[2]: "hello, debug window" в избранное  новое    модер. 
От: Nose 
Дата: 30.11.03 20:25
Здравствуйте, Nose, Вы писали:

N>Здравствуйте, Кодт, Вы писали:


N>А у меня в чистом виде не работает... VC7.1

В смысле, не компилится...
... << RSDN@Home 1.1.0 stable >>
Re[3]: мои три копейки.... в избранное  новое    модер. 
От: c-smilehttp://terrainformatica.com
Дата: 01.12.03 04:57
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>Здравствуйте, c-smile, Вы писали:


CS>>А вот мои три копейки в стиле kiss:


ЗХ>[зверьковыгрызено]


ЗХ>Андрей, kiss, он конечно и в африке kiss.

ЗХ>Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет.

Это зело философский вопрос...

Всякие debugging штуки должны следовать принципу неразрущающего контроля — минимизировать искажения измеряемой среды. Т.е. чем меньше код — тем лучше. Потому как код отладчика отлаживается только руками.

ЗХ>Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же?


Если у класса уже есть оператор вывода в ТЕКСТОВЫЙ поток, то что мешает вывести тогда этот класс в stderr ?
Так как я понимаю эта программа уже расчитана на работу с потоками...
Или опять мой здравый смысл не здравый?


ЗХ>STL, конечно, можно сколько угодно считать suxx'ом, но вот весьма нелюбимая тобой концепция потока все же заслуживает уважения.


Еще раз торжественно клянусь: STL НЕ SUCKS!!!! ( а скорее наоборот )

ЗХ>(не обижайся, если что )


Beerа тут и так валом. А вот сала нет. А без него добрым как станешь? И STL как ближнего своего как возлюбишь? Никак...
Шли лучче сало бочками!
Re[3]: мои три копейки.... в избранное  новое    модер. 
От: c-smilehttp://terrainformatica.com
Дата: 01.12.03 06:09
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, c-smile, Вы писали:


AS>хъ


AS>Про UNICODE забыл.


А зачем здесь UNICODE, объясните мне христа ради?

Eсть же "%s" и есть "%S".

Или этого недостаточно?

А проекты которые компилируются то в UNICODE, то в ANSII есть nonsence. Либо в то, либо в то...

А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы.
Re[4]: мои три копейки.... в избранное  новое    модер. 
От: Alexey Shirshov rsdnhttp://wise-orm.com
Дата: 01.12.03 06:15
Здравствуйте, c-smile, Вы писали:

[]

CS>А зачем здесь UNICODE, объясните мне христа ради?


При том, что код не скомпилируется.

хъ

CS>А проекты которые компилируются то в UNICODE, то в ANSII есть nonsence. Либо в то, либо в то...


У меня все такие. И это очень хорошо.

CS>А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы.


Если тебе так уж не нравится UNICODE — замени OutputDebugString на OutputDebugStringA
... << RSDN@Home 1.1.0 stable >>
Re[5]: мои три копейки.... в избранное  новое    модер. 
От: c-smilehttp://terrainformatica.com
Дата: 01.12.03 06:59
Здравствуйте, Alexey Shirshov, Вы писали:

CS>>А проекты которые компилируются то в UNICODE, то в ANSII есть nonsence. Либо в то, либо в то...

AS>У меня все такие. И это очень хорошо.

Везет же людям... Я серьезно.
У меня все какие-то задачи получаются дурацкие. Никак они не разделяются на UNICODE ни на ANSII.

Например HTML: имя атрибута — ANSII , значение атрибута — когда ascii, когда unicode, а когда вообще какой-нибудь агрегат типа 12pt. А в общем и целом HTML как бы unicode...
Ну т.е. #define UNICODE как мертвому припарки.


CS>>А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы.


AS>Если тебе так уж не нравится UNICODE — замени OutputDebugString на OutputDebugStringA


Понял. Согласен. Спасибо большое.
Просто я свои проекты всегда компилирую в т.н. ASCII режиме и использую unicode функции windows всегда литерально.
Как-то надежнее получается что-ли...

IMHO это мое все...
Re[3]: "hello, debug window" в избранное  новое    модер. 
От: Кодт rsdn 
Дата: 01.12.03 06:59
Здравствуйте, Nose, Вы писали:

N>>А у меня в чистом виде не работает... VC7.1

N>В смысле, не компилится...

Потому что я не копипастил, а руками печатал. Где-то мог погнать.
Сегодня восстановлю° исходник — выложу зипом.

Еще одна причина некомпиления — для _CrtDbgReport нужно включить опции дебага (/MLd | /MTd | /MDd).

---
° Вчера в угаре раскурочил — он тоже перестал компилиться
Перекуём баги на фичи!
Re[4]: мои три копейки.... в избранное  новое    модер. 
От: Зверёк Харьковский 
Дата: 01.12.03 08:19
Здравствуйте, c-smile, Вы писали:

[зверьковыгрызено]

ЗХ>>Андрей, kiss, он конечно и в африке kiss.

ЗХ>>Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет.

CS>Это зело философский вопрос...


CS>Всякие debugging штуки должны следовать принципу неразрущающего контроля — минимизировать искажения измеряемой среды. Т.е. чем меньше код — тем лучше. Потому как код отладчика отлаживается только руками.


так вот на мой вкус типобезопасный поток меньше эту самую среду изменит, чем твой вариант, если в него кинуть чего-то, что он не сможет переварить.

впрочем, спор "за и против" STL-like потоков, мы кажется, уже вели здесь
Автор: c-smile
Дата: 26.10.03


ЗХ>>Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же?

CS>Если у класса уже есть оператор вывода в ТЕКСТОВЫЙ поток, то что мешает вывести тогда этот класс в stderr ?
CS>Так как я понимаю эта программа уже расчитана на работу с потоками...
CS>Или опять мой здравый смысл не здравый?

а это можно будет сделать прозрачно? покажи, плз, я чего-то недопонимаю.


ЗХ>>(не обижайся, если что )

CS>Beerа тут и так валом. А вот сала нет. А без него добрым как станешь? И STL как ближнего своего как возлюбишь? Никак...
CS>Шли лучче сало бочками!
(иронически) — ой-вей, а кошерной курятинки вам таки не прислать?

ЗЫ: и саппорт HtmLayout'а со мной не общается почему-то... может, обиделся?
FAQ — це мiй ай-кью!
Re[3]: мои три копейки.... в избранное  новое    модер. 
От: Кодт rsdn 
Дата: 01.12.03 09:04
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>Андрей, kiss, он конечно и в африке kiss.

ЗХ>Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет.
ЗХ>Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же?

Тем более, что я решал гораздо более простую задачу: вывод строки и одного символа (из недр debugstream'а).
А не ставил задачу эмулировать printf.
Перекуём баги на фичи!
Re[4]: "hello, debug window" в избранное  новое    модер. 
От: Nose 
Дата: 01.12.03 09:15
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Nose, Вы писали:


N>>>А у меня в чистом виде не работает... VC7.1

N>>В смысле, не компилится...

К>Потому что я не копипастил, а руками печатал. Где-то мог погнать.

К>Сегодня восстановлю° исходник — выложу зипом.

К>Еще одна причина некомпиления — для _CrtDbgReport нужно включить опции дебага (/MLd | /MTd | /MDd).


Не... Первая причина + мое не очень хорошее(пока, надеюсь ) знание C++...

К>---

К>° Вчера в угаре раскурочил — он тоже перестал компилиться
... << RSDN@Home 1.1.0 stable >>
Re[6]: мои три копейки.... в избранное  новое    модер. 
От: Рома Микhttp://romamik.com
Дата: 01.12.03 14:13
Здравствуйте, c-smile, Вы писали:

CS>У меня все какие-то задачи получаются дурацкие. Никак они не разделяются на UNICODE ни на ANSII.

Хорошие у тебя задачи, полезные.

CS>Например HTML: имя атрибута — ANSII , значение атрибута — когда ascii, когда unicode, а когда вообще какой-нибудь агрегат типа 12pt. А в общем и целом HTML как бы unicode...

CS>Ну т.е. #define UNICODE как мертвому припарки.
Ну так это не мешает тебе использовать TCHAR для имен файлов и прочего, а html разбирать как char.

CS>>>А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы.

Ну, я бы так не сказал. Дело в том, что без всякой зависимости от задачи, если используются какие-нибудь функции Windows, что CreateWindow, что RegOpenKey, что все остальные в разных виндах — разные. Под win9x — только A, под NT — вроде бы и A, и W, а под WinCE — только W. И что будет дальше не совсем ясно. При том, что использование TCHAR особо не напрягает.

CS>Просто я свои проекты всегда компилирую в т.н. ASCII режиме и использую unicode функции windows всегда литерально.

CS>Как-то надежнее получается что-ли...
Но менее портабельно. Под WinCE ну никак не заведуться твои проекты после этого...
... << RSDN@Home 1.1.0 stable >>
Всем срочно гонять паровозы
Re[7]: мои три копейки.... в избранное  новое    модер. 
От: c-smilehttp://terrainformatica.com
Дата: 01.12.03 22:16
Здравствуйте, Рома Мик, Вы писали:

РМ>Ну так это не мешает тебе использовать TCHAR для имен файлов и прочего, а html разбирать как char.


Вот как раз для имен файлов char как-то совсем плохо работает...
Особенно у наших друзей на юге и юго-востоке...


CS>>>>А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы.

РМ>Ну, я бы так не сказал. Дело в том, что без всякой зависимости от задачи, если используются какие-нибудь функции Windows, что CreateWindow, что RegOpenKey, что все остальные в разных виндах — разные. Под win9x — только A, под NT — вроде бы и A, и W, а под WinCE — только W. И что будет дальше не совсем ясно. При том, что использование TCHAR особо не напрягает.

Под Win9x существуют CreateWindowW и RegOpenKeyW.
И вообще... если твои окна отрабатывают WM_CHAR то о CreateWindowA стоит забыть.
Потому как в общем случае в ANSII окне тебе еще и WM_IME_CHAR отрбатывать надо...
Ну т.е. код получается тот еще...


CS>>Просто я свои проекты всегда компилирую в т.н. ASCII режиме и использую unicode функции windows всегда литерально.

CS>>Как-то надежнее получается что-ли...
РМ>Но менее портабельно. Под WinCE ну никак не заведуться твои проекты после этого...

Хорошо что я этого не знал когда их заводил...
Re[8]: мои три копейки.... в избранное  новое    модер. 
От: Рома Микhttp://romamik.com
Дата: 01.12.03 23:21
Здравствуйте, c-smile, Вы писали:

РМ>>Ну так это не мешает тебе использовать TCHAR для имен файлов и прочего, а html разбирать как char.

CS>Вот как раз для имен файлов char как-то совсем плохо работает...
CS>Особенно у наших друзей на юге и юго-востоке...
Во-первых, попробуй вызвать CreateFileW под win9x. Низзя. Во-вторых, прекрасно работает в том числе и у наших африканских друзей: multibyte — это не обязательно singlebyte, даже и слова разные. А ANSI версии виндовых функций работают как раз с multibyte. В остальном стандратная библиотека нам поможет. Там куча всего начинающегося на _tcs.

CS>Под Win9x существуют CreateWindowW и RegOpenKeyW.

и возвращают ошибку ERROR_CALL_NOT_IMPLEMENTED. Проверенно. Занусси.

CS>И вообще... если твои окна отрабатывают WM_CHAR то о CreateWindowA стоит забыть.

Почему?
CS>Потому как в общем случае в ANSII окне тебе еще и WM_IME_CHAR отрбатывать надо...
А зачем?

Я честно говоря не в курсе, но разве я не могу для WM_CHAR вызывать WideCharToMultiByte в ANSI варианте и жить спокойно? Необязательно это делать для каждого сообщения, можно только когда данные наружу просят, а внутри все полностью юникодным сделать.
Не говоря о том случае, когда английских букв хватает.
Да и честно говоря что-то давненько я вообще с WM_CHAR не сталкивался. Его что-то Edit, да RichEdit контролы обрабатывают у меня.

РМ>>Но менее портабельно. Под WinCE ну никак не заведуться твои проекты после этого...

CS>Хорошо что я этого не знал когда их заводил...
Теперь знаешь. Будущие твои проекты...
... << RSDN@Home 1.1.0 stable >>
Всем срочно гонять паровозы
Re[9]: мои три копейки.... в избранное  новое    модер. 
От: c-smilehttp://terrainformatica.com
Дата: 02.12.03 00:04
Здравствуйте, Рома Мик, Вы писали:


CS>>Под Win9x существуют CreateWindowW и RegOpenKeyW.

РМ>и возвращают ошибку ERROR_CALL_NOT_IMPLEMENTED. Проверенно. Занусси.

Волшебные слова: Microsoft Layer for Unicode / UnicoWS.dll
Re[5]: мои три копейки.... в избранное  новое    модер. 
От: c-smilehttp://terrainformatica.com
Дата: 02.12.03 06:33
Здравствуйте, Зверёк Харьковский, Вы писали:

От елки-палки....

Люди, я не против предлагаемого решения. Оно классное и полезное! Если вы уже используете потоки ввода/вывода!

Я ж об этом сразу сказал!

Чего вы сразу как на красну тряпочку...

Если вы не используете потоки ввода/вывода, то вам сгодится dprintf...

Что за жизнь, а?
Re[6]: мои три копейки.... в избранное  новое    модер. 
От: Kluev 
Дата: 02.12.03 07:44
Оценка: :)
Здравствуйте, c-smile, Вы писали:

CS>Люди, я не против предлагаемого решения. Оно классное и полезное! Если вы уже используете потоки ввода/вывода!

CS>Если вы не используете потоки ввода/вывода, то вам сгодится dprintf...

Полностью согласен. Я например в своих программах вообще не вижу места где я мог бы применить их (потоки) без потери удобства и производительности. Особенно безумной (прошу не обижатся) я считаю идею юзать потоки для чтения структурированных файлов (xml,step) или сериализации. Поток это штука идеологически неструктурированная (есть только операции запихнуть-выпихнуть в-из потока), а в любых прогах данные являются структурированными и древовидными. Юзать древовидные классы для ввода-вывода гораздо удобнее (пример библиотека TiXml).

А рассуждения насчет типоопастности printf-подобных функция вообще напоминают вопли домохозяек, в С++ любой указатель является потенциально опасным и ничего все юзают и не жалуются.

ЗЫ: Извиняйте за офтоп.
Re[10]: мои три копейки.... в избранное  новое    модер. 
От: Рома Микhttp://romamik.com
Дата: 02.12.03 09:52
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Рома Мик, Вы писали:



CS>>>Под Win9x существуют CreateWindowW и RegOpenKeyW.

РМ>>и возвращают ошибку ERROR_CALL_NOT_IMPLEMENTED. Проверенно. Занусси.

CS>Волшебные слова: Microsoft Layer for Unicode / UnicoWS.dll

Угу. Я собственно с ним давно. Только писать везде CreateWindowW и т.д... В студии IntelliSense не работает от этого и т.д. Я уж лучше с tchar'ом как-нибудь. При том, что это проще, это дает больше возможностей.
... << RSDN@Home 1.1.0 stable >>
Всем срочно гонять паровозы
Re[6]: мои три копейки.... в избранное  новое    модер. 
От: Зверёк Харьковский 
Дата: 02.12.03 10:36
Здравствуйте, c-smile, Вы писали:

[зверьковыгрызено]

ну вот, довел я таки хорошего человека... (ты, человеческий детеныш, кого угодно достанешь...)
больше не буду чесслово.
FAQ — це мiй ай-кью!