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

时间:2009-07-19 10:28:22

标签: c++ visual-c++

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

我尝试了printf(),但没有显示。

7 个答案:

答案 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());