我应该使用哪个函数将文本输出到Visual Studio中的“输出”窗口?
我试过了,printf()
但是没有出现。
Answers:
OutputDebugString函数将执行此操作。
示例代码
void CClass::Output(const char* szFormat, ...)
{
char szBuff[1024];
va_list arg;
va_start(arg, szFormat);
_vsnprintf(szBuff, sizeof(szBuff), szFormat, arg);
va_end(arg);
OutputDebugString(szBuff);
}
WCHAR szBuff[1024]
_vsnwprintf
如果这是用于调试输出,则需要OutputDebugString。一个有用的宏:
#define DBOUT( s ) \
{ \
std::ostringstream os_; \
os_ << s; \
OutputDebugString( os_.str().c_str() ); \
}
这使您可以说出类似以下内容:
DBOUT( "The value of x is " << x );
您可以使用__LINE__
和__FILE__
宏对此进行扩展,以提供更多信息。
对于Windows和宽字符领域的用户:
#include <Windows.h>
#include <iostream>
#include <sstream>
#define DBOUT( s ) \
{ \
std::wostringstream os_; \
os_ << s; \
OutputDebugStringW( os_.str().c_str() ); \
}
使用OutputDebugString
函数或TRACE
宏(MFC),您可以进行printf
样式设置:
int x = 1;
int y = 16;
float z = 32.0;
TRACE( "This is a TRACE statement\n" );
TRACE( "The value of x is %d\n", x );
TRACE( "x = %d and y = %d\n", x, y );
TRACE( "x = %d and y = %x and z = %f\n", x, y, z );
有用的技巧-如果您使用调试__FILE__
,__LINE__
然后将其格式化为:
"file(line): Your output here"
那么当您在输出窗口中单击该行时,Visual Studio将直接跳至该代码行。一个例子:
#include <Windows.h>
#include <iostream>
#include <sstream>
void DBOut(const char *file, const int line, const WCHAR *s)
{
std::wostringstream os_;
os_ << file << "(" << line << "): ";
os_ << s;
OutputDebugStringW(os_.str().c_str());
}
#define DBOUT(s) DBOut(__FILE__, __LINE__, s)
我写了一篇关于此的博客文章,因此我始终知道可以在哪里查找:https : //windowscecleaner.blogspot.co.nz/2013/04/debug-output-tricks-for-visual-studio.html
使用OutputDebugString而不是afxDump。
例:
#define _TRACE_MAXLEN 500
#if _MSC_VER >= 1900
#define _PRINT_DEBUG_STRING(text) OutputDebugString(text)
#else // _MSC_VER >= 1900
#define _PRINT_DEBUG_STRING(text) afxDump << text
#endif // _MSC_VER >= 1900
void MyTrace(LPCTSTR sFormat, ...)
{
TCHAR text[_TRACE_MAXLEN + 1];
memset(text, 0, _TRACE_MAXLEN + 1);
va_list args;
va_start(args, sFormat);
int n = _vsntprintf(text, _TRACE_MAXLEN, sFormat, args);
va_end(args);
_PRINT_DEBUG_STRING(text);
if(n <= 0)
_PRINT_DEBUG_STRING(_T("[...]"));
}
尽管OutputDebugString
确实在调试器控制台上打印了一个字符串,但printf
对于后者能够使用%
表示法和可变数量的参数来格式化参数,这OutputDebugString
并不完全一样。
我认为在这种情况下,至少_RPTFN
具有_CRT_WARN
参数的宏是更好的选择者-它像格式化主体字符串一样printf
,将结果写入调试器控制台。
A小调(和奇怪,在我看来)警告与它是,它需要至少一个参数,格式字符串(一个与下面所有%
的替代),限制printf
并没有患。
对于需要puts
类似功能的情况-不设置格式,仅按原样编写字符串-会有它的同级项_RPTF0
(它忽略格式字符串后的参数,这是另一个奇怪的警告)。还是OutputDebugString
当然。
顺便说一下,还有从_RPT1
到的所有内容,_RPT5
但我还没有尝试过。老实说,我不明白为什么要提供这么多的程序,而它们实际上都在做同样的事情。