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

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

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


person jagttt    schedule 30.01.2009    source источник


Ответы (6)


Построй свой собственный.

трассировка.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

трассировка.ч:

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

затем просто #include "trace.h", и все готово.

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

person Ferruccio    schedule 30.01.2009
comment
wvsprintf не обрабатывает числа с плавающей запятой (%f). Вместо этого можно использовать vsprintf. - person JcMaco; 29.11.2011
comment
Для Linux C++ я изменил ваш код с помощью #include <stdarg.h>, #include <cstdio>, заменил wvsprinf на vsnprinf. Затем заменил OutputDebugString на std::clog << buffer << std::flush;. - person enthusiasticgeek; 01.08.2012
comment
В выпускных сборках Visual Studio генерирует предупреждение C4013 (уровень предупреждения 3), а также предупреждения C4555 (уровень предупреждения все) для каждого случая TRACE. Чтобы предотвратить появление предупреждений, я изменил часть false && _trace на __noop. Это также способ, которым MFC делает это. - person GOTO 0; 30.08.2012

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

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

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

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

person Ulf Lindback    schedule 30.01.2009
comment
Я хотел использовать этот подход, однако есть некоторый дополнительный багаж ATL, который приходит вместе с этим для проекта, который не является ATL. Я работаю с C++/CLI с Window Forms и добавляю atltrace.h include, вызванные ошибками компилятора, поэтому я решил просто использовать OuputDebugString() вместо этого, поскольку у меня есть всего несколько текстовых строк для вывода в разных местах. - person Richard Chambers; 23.06.2015

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

person Fredrik Jansson    schedule 30.01.2009

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

person sarat    schedule 11.03.2009

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

Здесь я делюсь своим макросом TRACE на C++, основанным на идеях 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');
}

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

person oHo    schedule 30.01.2013
comment
Я получил сообщение об ошибке при попытке его использования: выражение ошибки (активное) E2140 должно иметь целочисленный или неограниченный тип перечисления. - person Moti Hamo; 29.05.2019

Я видел в сети следующее: #define TRACE printf

Немного поэкспериментировав, пришел к следующему:

#ifdef _DEBUG
#define TRACE printf
#else
#define TRACE 
#endif
person user214810    schedule 05.10.2020