【问题标题】:How do I get text into Visual Studio Output Window using STL IO?如何使用 STL IO 将文本输入 Visual Studio 输出窗口?
【发布时间】:2009-11-12 09:52:49
【问题描述】:

我一直认为在调试器中运行的 MSVC++ 应用程序的输出窗口被映射到标准输出流之一。但是当我在 Windows MFC 应用程序中运行此代码时,什么都看不到:

std::cerr << "cerr"<<std::endl;
std::cout << "cout"<<std::endl;
std::clog << "clog"<<std::endl;

这是 Windows 的东西还是 VC++ 的东西? TRACE 和 OutputDebugString 之类的函数/宏是如何写入此窗口的,我不应该不使用它们就可以这样做吗?

【问题讨论】:

    标签: debugging visual-c++


    【解决方案1】:

    没有标准样式流映射到 Visual Studio 输出窗口。完成此操作的函数是 OutputDebugString()。

    最接近此类的方法是创建自己的包装类,其行为类似于 ostream,并在其下调用 OutputDebugStream。

    【讨论】:

    • OutputDebugStream,顾名思义,是否只在定义_DEBUG 时起作用?如果是这样,那么调试 release-mode-with-debug-info .exes 并没有多大用处...... TRACE 也不是。
    • OutputDebugString 是一个 Windows API 函数,因此可用于调试和发布版本。通常,像 TRACE 这样的宏仅用于调试,因此如果您希望继续在发布版本中写入消息,则需要显式调用 OutputDebugString。
    • 您可以通过在自定义包装器stackoverflow.com/questions/1389538/…中启用或禁用此类调用来进一步自定义此调用
    • 根据项目设置,标准流可以映射到输出窗口,但这不适用于例如由第三方主机应用程序运行的 DLL 项目。让微软忽略 'helloworld.cpp' 中 16.7% 的代码作为要求。
    【解决方案2】:
    【解决方案3】:

    您可以使用RTP Macro:

    std:string myString = "SOMETHING";
    _RPT1(_CRT_WARN, "%s\n", myString.c_str());
    

    OutputDebugString

    std:string myString = "SOMETHING";
    OutputDebugString(savedStatementText.c_str());
    

    【讨论】:

      【解决方案4】:

      这是流友好的方法,我在网上找到的:

      class debug_stream : public std::ostringstream
      {
      public:
          template<typename T>
          friend debug_stream& operator<<(debug_stream& os, T&& s);
      };
      
      template<typename T>
      debug_stream& operator<<(debug_stream& os, T&& s)
      {
          (ostringstream&amp;)os << s;
          PrintToDebug(os.str());
          os.str("");
          return os;
      }
      
      class dbgview_buffer : public std::stringbuf
      {
      public:
          ~dbgview_buffer()
          {
              sync(); // can be avoided
          }
      
          int sync()
          {
              OutputDebugString(str().c_str());
              str("");
              return 0;
          }
      };
      

      这样使用:

      dbgview_buffer buf;
      ostream dbgview(&buf);
      dbgview << "test" << endl;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多