【问题标题】:Build DebugOutputString构建调试输出字符串
【发布时间】:2014-03-14 07:21:13
【问题描述】:

除了这个之外,还有没有其他可能连接 DebugOutputString 的方法:

std::ostringstream outs;   
outs.precision(6);
outs << mMainWndCaption << _T("FPS: ") << fps;
DebugOutputString(_T(outs.str().c_str()));

也许像 printf 那样更容易输出?

例如,我正在寻找类似DebugOutputString(_T("FPS: %i", fps)); 的东西

【问题讨论】:

    标签: c++ c visual-studio visual-c++


    【解决方案1】:

    ostringstream 方法的一个问题是,如果您正在构建一个 unicode 应用程序,您可能会遇到有趣的结果。我猜你在这里没有使用 unicode,因为:

    DebugOutputString(_T(outs.str().c_str()));
    

    不会编译 - 它会预处理到:

    DebugOutputString(Louts.str().c_str());
    

    即使正确地执行此操作,您也需要根据您的项目设置有条件地使用basic_ostringstream&lt;char&gt;basic_ostringstream&lt;wchar_t&gt;。但我离题了。


    查看FormatMessage API 调用。它的使用有一些注意事项,例如系统是否为您分配内存,如果是,您需要删除缓冲区等。它有一些稍微不同的格式化选项。但它会做你想做的事。

    在您的情况下,您可以编写一个方法来获取您的参数并将它们直接传递给DebugOutputString - 事实上,API 页面提供了一个返回格式化缓冲区的示例......您只需要记住 @ 987654328@使用后。

    这是一个快速版本:

    void OutputFormattedDebug(LPTSTR pMsg, ...) {
        LPTSTR pBuffer = NULL;
        va_list args = NULL;
        va_start(args, pMsg);
        FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, pMsg, 0, 0, (LPTSTR)&pBuffer, 0, &args);
        va_end(args);
    
        if (pBuffer) {
            OutputDebugString(pBuffer);
            LocalFree(pBuffer);
        }
    }
    ...
    OutputFormattedDebug(TEXT("Just a test: %1\n"), TEXT("Hello"));
    

    这会在调试窗口中输出Just a test: Hello。如果您指定宽度和其他东西,它会有点怪异,但查看文档应该会让您明白。

    【讨论】:

    • “va_list args = NULL;”有问题:无法初始化一个va_list,需要改成“va_list args;”
    【解决方案2】:

    就在昨天,我把它放到了我自己的一个项目中。
    也许它会帮助你:

    void DebugWrite(LPCTSTR format, ...)
    {
        CString text;
        va_list args;
        va_start(args, format);
        text.FormatV(format, args);
        va_end(args);
    
        OutputDebugString((LPCTSTR)text);
    }
    

    你可以这样称呼它:

    DebugWrite(_T("FPS: %i"), fps);
    

    【讨论】:

    • 很好很简单,但确实有点依赖于使用 MFC/ATL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多