【问题标题】:Printing to output window in Visual Studio在 Visual Studio 中打印到输出窗口
【发布时间】:2012-10-13 05:08:24
【问题描述】:

我对 C++ 很陌生,最近从在 Linux 上使用 g++ 编译切换到了 Visual Studio。我试图编写一个简单的程序来测试这样的一些:

#include <iostream>

void main()
{
    // Things
}

我使用cout &lt;&lt; 来显示函数返回的内容,然后我才意识到它不能以这种方式打印到 Visual Studio 中的输出窗口。我知道我可以使用调试模式,但是 Visual Studio 中有没有办法将输出显示到窗口?我发现的一篇较早的帖子建议使用 OutputDebugString,但我没有将代码编写为 Win32 应用程序,而且我认为对于简单的 cpp 文件不存在此功能。

还有,是不是程序执行的时候会弹出一个黑窗,然后又马上消失的原因?

【问题讨论】:

  • //things 中到底是什么?控制台通常不会立即消失,std::cout 通常会打印到它。
  • @chris 是的,我不知道 cout 会在那里打印,而且 //things 很短。我需要做的就是在最后添加一个断点。谢谢!
  • 哦,我知道你的意思。出于某种原因,它在调试时不会等你,但是当你开始时没有调试时它会等待。我不太清楚为什么。在我说话时,我不妨指出,任何托管环境(如 Windows)都需要来自 main 的整数返回值。
  • 如果您的 IDE 没有提供使用持久控制台启动控制台程序的方法,那就是垃圾。

标签: c++ visual-studio-2010


【解决方案1】:

OutputDebugString 为胜利。它确实存在。只需包含 windows.h。它就在那里。

有一些方法可以有效地将 stderr 和 stdout 连接到管道并将输出重新连接到 OutputDebugString,但听起来您正在寻找一种简单的方法。任何写入标准输出(cout,随便)的东西都会进入控制台窗口,所以在你去 OutputDebugString 之前先检查你的控制台窗口是否有输出......

说到控制台窗口...

黑色弹出并立即消失的原因是您的控制台窗口正在打开和关闭,并且您的进程很可能在完成任何实质性操作之前就完成了。在 IDE 中的 main() 末尾插入断点。然后你可以 Alt + Tab 到它。

顺便说一句:如果您使用 OutputDebugString,它不会 CRLF 您发送的文本,因此请将其包含在您的输出文本中。

【讨论】:

  • 谢谢!我没有意识到输出会显示在控制台窗口中......添加了一个断点,现在我可以看到它了。感谢您展示如何使用 OutputDebugString!
【解决方案2】:

下面是我写的一个可移植的 TRACE 宏。

在 Windows 上,它基于 WhozCraig 的回答中指出的OutputDebugString

#ifdef ENABLE_TRACE
#  ifdef _MSC_VER
#    include <windows.h>
#    include <sstream>
#    define TRACE(x)                           \
     do {  std::stringstream s;  s << (x);     \
           OutputDebugString(s.str().c_str()); \
        } while(0)
#  else
#    include <iostream>
#    define TRACE(x)  std::clog << (x)
#  endif        // or std::cerr << (x) << std::flush
#else
#  define TRACE(x)
#endif

例子:

#define ENABLE_TRACE  // Can depend on _DEBUG or NDEBUG macros
#include "my_above_trace_header.h"

int main (void)
{
   int     v1 = 123;
   double  v2 = 456.789;
   TRACE ("main() v1="<< v1 <<" v2="<< v2 <<'\n');
}

【讨论】:

  • 可能需要将宏参数括在括号中以避免意外的宏扩展错误。
  • 谢谢@BenHymers,我做到了;-)
  • 也许使用__FUNCTION__ 而不是要求调用者提供它。或者,我喜欢在转储普通调试或错误消息时将__FILE____LINE__ 集成到一个类似的宏中。当您打开源文件并滚动到该行时,该功能非常明显。无论如何,正确的想法。 +1。
【解决方案3】:

如果您想从单元测试用例中写入输出窗口,则可以使用以下内容:

#include "CppUnitTest.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

TEST_METHOD(testingsomething)
{
    Logger::WriteMessage("Hello output window");
}

【讨论】:

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