Как я могу использовать макрос TRACE в не-MFC проектах? - PullRequest
24 голосов
/ 30 января 2009

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

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

Ответы [ 5 ]

28 голосов
/ 30 января 2009

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

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" и все готово.

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

7 голосов
/ 30 января 2009

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

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

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

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

3 голосов
/ 30 января 2009

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

1 голос
/ 30 января 2013

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

Здесь я делюсь своим макросом TRACE на C ++, основанном на идеях Ферруччо и энтузиастов.

#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');
}

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

1 голос
/ 11 марта 2009

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

...