Как я могу использовать макрос TRACE в проектах, отличных от MFC?
Я хочу использовать макрос TRACE() для получения вывода в окне отладки в Visual Studio 2005 в формате MFC Проект С++, но какой дополнительный заголовок или библиотека необходимы?
Есть ли способ размещения сообщений в окне вывода отладки и как я могу это сделать?
Ответы
Ответ 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');
}
Любые улучшения/предложения/вклады приветствуются; -)