如何在Visual C++中保持控制台窗口打开?

Raú*_*Roa 182 console visual-c++

我开始使用Visual C++,我想知道如何保持控制台窗口.

例如,这将是典型的"hello world"应用程序:

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我错过的是什么?

小智 382

Ctrl+F5而不是仅仅启动项目F5.

Press any key to continue . . .程序退出后,控制台窗口现在将保持打开状态.

请注意,这需要Console (/SUBSYSTEM:CONSOLE)链接器选项,您可以按如下方式启用它:

  1. 打开项目,然后转到解决方案资源管理器.如果您在K&R跟随我,您的"解决方案"将是"hello",其中包含1个项目,也是"hello"的粗体.
  2. 右键单击"hello"(或任何项目名称).
  3. 从上下文菜单中选择"属性".
  4. 选择"配置属性>链接器>系统".
  5. 对于右侧窗格中的"子系统"属性,请单击右侧列中的下拉框.
  6. 选择"控制台(/ SUBSYSTEM:CONSOLE)"
  7. 单击"应用",等待它完成所做的任何操作,然后单击"确定".(如果"Apply"显示为灰色,请选择其他子系统选项,单击Apply,然后返回并应用控制台选项.我的经验是OK本身不起作用.)

CTRL-F5和子系统提示一起工作; 它们不是单独的选择.

(来自http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6的DJMorreTX提供)

  • 这运行程序没有调试; 最好有一个在调试和普通运行模式下都能运行的解决方案. (34认同)
  • 对于那些无法在makefile项目中使用此解决方案的人来说,这是由于Visual Studio中的一个错误.我刚刚发布了修复答案. (3认同)

Gor*_*son 41

标准方式是cin.get()在您的退货声明之前.

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • -1为`_tmain`.我为`cin.get()`投了另一个-1而不是为F5设置断点或使用Ctrl F5.但我只允许一个downvote. (8认同)
  • @Cheers:`_tmain`有什么问题?这是编写面向控制台子系统的Windows应用程序的标准方法.偏离这个标准是不好的做法.显然,这里没有人谈论便携式代码; 问题是Visual C++和`_tmain`是示例代码中出现的签名.现在是放弃这种宗教的时候了.Windows默认为"非标准",并且遵循***标准有很好的理由. (8认同)
  • @CodyGray:我对'_tmain`的downvote是因为它完全没必要*非标准*(国际C++标准需要一个简单的`main`),并且因为它使用了微软的`T`宏方案,这是不必要的复杂性和措辞用于支持Windows 9x.如果你觉得偏离标准是不好的做法,那么你绝对不应该使用`tmain`.使用`tmain`没有充分的理由,除了拖钓或专业人士,显示一个人的完全无能. (8认同)
  • 这有效但Ctrl + F5更好,特别是在跟踪全局对象销毁等时. (7认同)
  • 我知道,因为程序已经在使用cout,它已经被处理了,但我认为值得一提的是你需要#include <iostream>以及使用std命名空间:std :: cin.get() . (4认同)
  • "标准方式"?当然这只是"单向"? (2认同)

Sam*_*ell 24

在线上放一个断点return.

你在调试器中运行它,对吧?

  • 大多数情况下很困难,因为程序中可能有多个退出点 (15认同)

Mar*_*rin 17

另一种选择是使用

#include <process.h>
system("pause");
Run Code Online (Sandbox Code Playgroud)

虽然这不是很便携,因为它只能在Windows上运行,但它会自动打印

按任意键继续...


iko*_*o79 10

正如一些人已经指出的那样,Zoidberg 的解决方案没有附加调试器,这是您通常不想要的。

我认为最好的选择是相应地配置您的 VS(从 VS 2017 开始),方法是转到“工具”>“选项”>“调试”>“常规”。在那里,您取消选中“调试停止时自动关闭控制台”(在最底部),这可能在您的情况下被选中。

编辑:

在这里添加 Wheezil 的附加信息(谢谢):确保通过指定(项目属性 > 链接器 > 系统 > 子系统)构建控制台子系统/SUBSYSTEM:CONSOLE

  • 我未选中此框,但它仍然关闭。我不知道去哪里将 @Wheezil 的建议添加到链接器中。 (2认同)

JBe*_*ley 7

对于makefile项目,由于Visual Studio中的错误(至少在2012版本之前 - 我还没有测试过2013年),接受的解决方案失败了.这个bug 在这里详述.

为了在makefile项目上终止程序后让控制台暂停,请执行以下步骤(对于2010 - 2012以外的版本,这可能会有所不同):

1)传递/SUBSYSTEM:CONSOLE给链接器.- 编辑:见下文.

2)在文本编辑器中打开项目文件(.vcxproj).

3)在根<project>标签内插入以下内容:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>
Run Code Online (Sandbox Code Playgroud)

4)在解决方案中重新加载项目.

5)运行程序而不调试(CTRL + F5).

编辑:

根据我在下面的评论,设置链接器选项/SUBSYSTEM:CONSOLE实际上与makefile项目无关(如果您使用的是MSVC以外的编译器,则不一定可能).重要的是该设置被添加到.vcxproj文件中,如上面的步骤3所示.