如何在Visual Studio中写入“输出”窗口?


79

我应该使用哪个函数将文本输出到Visual Studio中的“输出”窗口?

我试过了,printf()但是没有出现。

Answers:


84

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);
}

3
仍然有一个问题。_vsnprintf可能会截断格式化后的字符串以适合缓冲区,但是如果发生这种情况,该字符串将不会被nul终止。请参阅msdn.microsoft.com/en-us/library/1kt27hek.aspxstackoverflow.com/questions/357068
2009年

您正在编译器选项中使用多字节字符集。然后,您需要使用WCHAR szBuff[1024] _vsnwprintf
Lefteris E 2013年

警告1警告C4996:'_vsnwprintf':此函数或变量可能不安全。考虑改用_vsnwprintf_s。;-)
hfrmobile

1
我是否需要#include某些东西才能使OutputDebugString工作?
米歇尔

包括Windows.h
更新日期:2017年

73

如果这是用于调试输出,则需要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() );  \
}

1
你能解释一下这个说法吗?-“您可以使用LINEFILE宏对此进行扩展,以提供更多信息。
Yousuf Azad

2
@ sami1592这两个宏由编译器定义为(意外)行和文件,因此您可以自动输出包含行和文件的更多有用的日志。
ZachB

20

使用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 );

我在Visual Studio中的编译器无法识别ALTTRACE2或ALTTRACE。我需要#include一些东西吗?是否因为它不是MFC项目?对我来说只是c ++。
米歇尔

我正在Visual Studio 2017 C ++中测试旧的3DES算法。我通过将所有“ printf”替换为“ TRACE”来使代码正常工作。很好打!谢谢!
保罗

3

有用的技巧-如果您使用调试__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


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("[...]"));
}

0
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

wstring outputMe = L"can" + L" concatenate\n";
OutputDebugString(outputMe.c_str());

#include <string>
Andrew

0

尽管OutputDebugString确实在调试器控制台上打印了一个字符串,但printf对于后者能够使用%表示法和可变数量的参数来格式化参数,这OutputDebugString并不完全一样。

我认为在这种情况下,至少_RPTFN具有_CRT_WARN参数的宏是更好的选择者-它像格式化主体字符串一样printf,将结果写入调试器控制台。

A小调(和奇怪,在我看来)警告与它是,它需要至少一个参数,格式字符串(一个与下面所有%的替代),限制printf没有患。

对于需要puts类似功能的情况-不设置格式,仅按原样编写字符串-会有它的同级项_RPTF0(它忽略格式字符串后的参数,这是另一个奇怪的警告)。还是OutputDebugString当然。

顺便说一下,还有从_RPT1到的所有内容,_RPT5但我还没有尝试过。老实说,我不明白为什么要提供这么多的程序,而它们实际上都在做同样的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.