【问题标题】:What can explain std::cout not to display anything?什么可以解释 std::cout 不显示任何内容?
【发布时间】:2010-04-13 08:05:58
【问题描述】:

无论出于何种原因,std::cout 不会在我的应用程序中显示任何内容。下面是我的开发环境的描述。

我正在使用 Qt Creator 开发一个 Qt 应用程序。由于无法从我的工作站 (XP64) 启动 Qt Creator,我目前正在使用 Visual Studio 2008 和 Qt 插件(通过导入 .pro 项目文件)开发它。一切似乎都很好,并且应用程序正常工作。

在某些情况下(取决于命令行参数),我不想启动 HIM,只是为了在 CLI 中显示几句话(例如命令行所需的参数)。

我没有收到任何错误,但没有显示任何内容。 我确信正在运行的相应代码是(经典)以下代码:

std::cout << "is this going to be displayed ?" << std::endl;

你知道为什么什么都没有显示吗?

【问题讨论】:

  • 为什么不在这一行下一个断点,看看这段代码是否真的执行了……?执行了吗……?
  • 我也有类似的问题,但那是因为我写了std::cout &lt;&lt; "Number of SIFT Keypoints: " + siftImageKeypoints.size() &lt;&lt; std::endl;。解决方案是将 + 替换为

标签: c++ visual-studio qt qt-creator cout


【解决方案1】:

在 Windows 上,程序通常构建为 SUBSYSTEM:WINDOWS application or as SUBSYSTEM:CONSOLE。

使用 SUBSYSTEM:CONSOLE 构建的程序应为文本模式应用程序。对于这种类型的应用程序,stdout 和 stderr 会打印到您启动它们的控制台,并在必要时创建一个新控制台。

相比之下,SUBSYSTEM:WINDOWS 应用程序不需要控制台。您仍然可以写入 stdout 和 stderr,但它们通常不会去任何地方。您可以使用AllocConsole 创建要打印到的控制台,但这将始终打印到新创建的控制台窗口,而不是您启动程序的控制台窗口。

SUBSYSTEM:WINDOWS 应用程序的一个技巧是,即使没有控制台,您仍然可以管道 stdout 和 stderr。要管道标准输出,您可以这样做:

YourApplication.exe > output.txt

或者如果你有cat(或同等学历):

YourApplication.exe | cat

另外请注意,SUBSYSTEM:WINDOWS 应用程序和 SUBSYSTEM:CONSOLE 应用程序之间并没有任何区别,只是 Windows 在创建进程时如何处理它们。 (您可以在 SUBSYSTEM:CONSOLE 应用程序中创建窗口。)You therefore can easily switch between SUBSYSTEM types(例如,使用 SUBSYSTEM:CONSOLE 进行调试构建,使用 SUBSYSTEM:WINDOWS 进行发布)。

【讨论】:

  • 我不知道。谢谢。
  • 也获得标准错误:YourApplication.exe 2&gt;&amp;1 | cat
【解决方案2】:

好的,找到答案。简单的回答,当然,在遇到此类问题时一如既往。 Michael Aaron 走在正确的轨道上。

只需在项目配置(/Configuration properties/Linker/System)中将 SubSystem 更改为 Console 即可使整个工作正常进行。 GUI 仍然可以工作,但有一个后台控制台。我可以处理。

【讨论】:

  • 这仍然有问题,因为我可以很容易地看到cout,如果我使用cygwin的shell来启动程序,我通常看不到。这可能是因为大多数 WinAPI 程序使用WriteConsole 来输出数据,而不是cout 和stdout。
【解决方案3】:

试试

CONFIG += 控制台

在您的 .pro 文件中。

【讨论】:

  • 不要忘记标记为答案,如果您对此回复感到满意并认为它解决了您的问题(您显然这样做了)。
【解决方案4】:

Windows 区分控制台应用程序和 GUI 应用程序,默认情况下不为 GUI 应用程序创建控制台 (see this page from MSDN)。您可以使用AllocConsole 创建一个。

【讨论】:

  • @Benoit,无论你在哪里启动它都无关紧要......这完全取决于应用程序本身(是否使用 WinMain 或与 Windows GUI 关联的其他功能)。
  • 不仅需要创建console,还需要打开in、out、err的标准文件句柄
  • @MichaelAaronSafyan 从哪里启动它很重要。我可以很容易地看到cout,如果我使用 cygwin 的 shell 来启动程序,我通常看不到它,但我在 CMD 中看不到它。
【解决方案5】:

也许不是 std::cout 行使它不显示,而是包含它的函数。也许它根本没有被调用,这就是 std::cout 不起作用的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多