【发布时间】:2023-03-18 23:24:01
【问题描述】:
我想在非MFC C++ 项目中使用 TRACE() 宏在Visual Studio 2005 的调试窗口中获取输出,但需要哪些额外的头文件或库?
有没有办法将消息放在调试输出窗口中,我该怎么做?
【问题讨论】:
标签: c++ visual-c++ visual-studio-2005
我想在非MFC C++ 项目中使用 TRACE() 宏在Visual Studio 2005 的调试窗口中获取输出,但需要哪些额外的头文件或库?
有没有办法将消息放在调试输出窗口中,我该怎么做?
【问题讨论】:
标签: c++ visual-c++ visual-studio-2005
构建你自己的。
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" 就可以了。
免责声明:我只是从个人项目中复制/粘贴了这段代码,并取出了一些项目特定的东西,但没有理由它不应该工作。 ;-)
【讨论】:
#include <stdarg.h>、#include <cstdio> 修改了你的代码,用vsnprinf 替换了wvsprinf。然后将OutputDebugString 替换为std::clog << buffer << std::flush;。
false && _trace 部分更改为__noop。这也是 MFC 的做法。
如果你使用 ATL,你可以试试 ATLTRACE。
在 afx.h 中将 TRACE 定义为(至少在 vs 2008 中):
// extern ATL::CTrace TRACE;
#define TRACE ATLTRACE
而 ATLTRACE 可以在 atltrace.h 中找到
【讨论】:
atltrace.h 包含导致编译器错误,所以我采用了仅使用 OuputDebugString() 的方法,因为我只有几个文本字符串要在不同的地方输出。
您可以尝试 DebugOutputString 函数。 TRACE 仅在调试版本中启用。
【讨论】:
据我了解,wvsprintf 的格式有问题。改用 _vsnprintf (或 thcar 版本 _vsntprintf )
【讨论】:
感谢这些答案,我已经修复了我的错误 :-)
在这里,我根据 Ferruccio 和热心极客的想法分享我的 C++ 中的 TRACE 宏。
#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');
}
欢迎任何改进/建议/贡献;-)
【讨论】:
我在网上看到了以下内容:
#define TRACE printf
稍微开发一下,得出以下结论:
#ifdef _DEBUG
#define TRACE printf
#else
#define TRACE
#endif
【讨论】: