我应该使用哪个函数将文本输出到Visual Studio中的“输出”窗口?
我尝试了printf()
,但没有显示。
答案 0 :(得分:75)
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);
}
答案 1 :(得分:72)
如果这是用于调试输出,那么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() ); \
}
答案 2 :(得分:18)
使用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 );
答案 3 :(得分:1)
有用的提示 - 如果您使用__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
答案 4 :(得分:0)
使用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("[...]"));
}
答案 5 :(得分:0)
即使OutputDebugString
确实将一串字符输出到调试器控制台,但它与printf
不完全相同,后者能够使用%
表示法格式化参数可变数量的参数,OutputDebugString
没有。
我会假设_RPTFN
宏,至少有_CRT_WARN
参数,在这种情况下是更好的追求者 - 它将主要字符串格式化为printf
,写作调试器控制台的结果。
一个未成年人(在我看来很奇怪)需要注意的是,它需要至少一个参数跟随格式字符串(具有所有%
替换的那个),限制printf
不会受到影响。
对于需要puts
类似功能的情况 - 没有格式化,只是按原样编写字符串 - 有它的兄弟_RPTF0
(忽略格式字符串后面的参数,另一个奇怪的警告)。或者OutputDebugString
当然。
顺便说一句,从_RPT1
到_RPT5
的所有内容都有,但我还没试过。老实说,我不明白为什么提供这么多程序都做同样的事情。
答案 6 :(得分:0)
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
wstring outputMe = L"can" + L" concatenate\n";
OutputDebugString(outputMe.c_str());