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

k2fxgqgv  于 2023-03-09  发布在  其他
关注(0)|答案(7)|浏览(364)

我应该使用哪个函数将文本输出到Visual Studio中的“输出”窗口?
我尝试了printf(),但没有显示。

jucafojl

jucafojl1#

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

t9eec4r02#

如果这是调试输出,那么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() );  \
}
w7t8yxp5

w7t8yxp53#

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

smdncfj34#

有用的提示-如果您使用__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

sqyvllje

sqyvllje5#

使用输出调试字符串而不是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("[...]"));
}
cgfeq70w

cgfeq70w6#

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

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

vkc1a9a27#

尽管OutputDebugString确实向调试器控制台打印了一个字符串,但在能够使用%表示法和可变数量的参数来格式化参数方面,它与printf并不完全相同,这是OutputDebugString所不能做到的。
我认为_RPTF*N*系列宏(至少带有_CRT_WARN参数)在这种情况下是更好的选择--它将主字符串的格式设置为与printf非常相似,将结果写入调试器控制台。
一个小的(在我看来也很奇怪的)警告是,它需要 * 至少一个参数 * 跟随在格式字符串之后(所有%都用于替换的那个),printf * 没有 * 受到这个限制。
对于需要类似puts的功能--不需要格式化,只需按原样编写字符串--的情况,可以使用_RPTF0(它 * 忽略 * 第一个参数之后的参数,这是另一个奇怪的警告),当然也可以使用OutputDebugString
顺便说一句,还有从_RPT1_RPT5的所有程序,但我还没有尝试过它们。老实说,我不明白为什么提供这么多程序来做本质上相同的事情。

相关问题