Подтвердить что ты не робот

Как я могу использовать макрос TRACE в проектах, отличных от MFC?

Я хочу использовать макрос TRACE() для получения вывода в окне отладки в Visual Studio 2005 в формате MFC Проект С++, но какой дополнительный заголовок или библиотека необходимы?

Есть ли способ размещения сообщений в окне вывода отладки и как я могу это сделать?

4b9b3361

Ответ 1

Создайте свой собственный.

trace.cpp:

#ifdef _DEBUG
bool _trace(TCHAR *format, ...)
{
   TCHAR buffer[1000];

   va_list argptr;
   va_start(argptr, format);
   wvsprintf(buffer, format, argptr);
   va_end(argptr);

   OutputDebugString(buffer);

   return true;
}
#endif

trace.h:

#include <windows.h>
#ifdef _DEBUG
bool _trace(TCHAR *format, ...);
#define TRACE _trace
#else
#define TRACE false && _trace
#endif

то просто #include "trace.h", и вы все настроены.

Отказ от ответственности: я просто копировал/вставлял этот код из личного проекта и извлекал некоторые специфические для проекта материалы, но нет причин, по которым он не должен работать.; -)

Ответ 2

Если вы используете ATL, вы можете попробовать ATLTRACE.

TRACE определяется в afx.h как (по крайней мере, в версии 2008):

// extern ATL::CTrace TRACE;
#define TRACE ATLTRACE

И ATLTRACE можно найти в atltrace.h

Ответ 3

Вы можете попробовать функцию DebugOutputString. TRACE включен только в отладочных сборках.

Ответ 4

В моем понимании wvsprintf имеет проблемы с форматированием. Вместо этого используйте _vsnprintf (или thcar version _vsntprintf)

Ответ 5

Благодаря этим ответам я исправил свою ошибку: -)

Здесь я делюсь своим макросом TRACE на С++ на основе идей Ferruccio и энтузиастов.

#ifdef ENABLE_TRACE
#  ifdef _MSC_VER
#    include <windows.h>
#    include <sstream>
#    define TRACE(x)                           \
     do {  std::stringstream s;  s << (x);     \
           OutputDebugString(s.str().c_str()); \
        } while(0)
#  else
#    include <iostream>
#    define TRACE(x)  std::clog << (x)
#  endif        // or std::cerr << (x) << std::flush
#else
#  define TRACE(x)
#endif

Пример:

#define ENABLE_TRACE  //can depend on _DEBUG or NDEBUG macros
#include "my_above_trace_header.h"

int main (void)
{
   int     v1 = 123;
   double  v2 = 456.789;
   TRACE ("main() v1="<< v1 <<" v2="<< v2 <<'\n');
}

Любые улучшения/предложения/вклады приветствуются; -)