防止Visual Studio C/C++控制台应用程序关闭的控制台窗口

523

这可能是一个尴尬的问题,因为答案显而易见。

我已经使用Visual Studio多年了,但这是我第一次进行“控制台应用程序”开发。

当我运行我的应用程序时,控制台窗口弹出,程序输出出现,然后窗口关闭,应用程序退出。

有没有办法让它保持打开状态,直到我检查完输出,或者在窗口关闭后查看结果?


Monodevelop做你所期望的事情。 - ctrl-alt-delor
25个回答

489

如果您在不调试的情况下运行程序(Ctrl+F5),默认情况下会提示您按回车键关闭窗口。如果您想使用调试器,您应该在最后一行设置断点。


277
如果你有一个C++应用程序,运行时不需要调试,但控制台窗口仍然关闭,那么你需要记得在“属性”→“链接器”→“系统”下显式设置子系统为“Console”。如果你从一个空项目开始,就会导致子系统未设置的情况发生。 - Trevor Robinson
4
无效 :( 控制台窗口打开并立即关闭,但日志暂停并等待额外按下F5键。 - CodyBugstein
44
正确答案是由@TrevorRobinson提供的:如果您找不到配置属性在哪里,以下是详细说明:在 Visual Studio 中右键单击您的项目 > 属性 > 配置属性 > 链接器 > 系统,在 "子系统" 中更改为 "控制台"。 - Debajit
4
特雷弗·罗宾逊是正确的。如果您启动一个空白项目并选择 C++ 项目,您需要前往“视图(View)” - > “属性管理器(Property Manager)” - > “属性(扳手图标)” - > “配置属性(Config. Properties)” - > “链接器(Linker)” - > “系统(System)” - > “子系统(Subsystem)”,在下拉菜单中选择“控制台(Console)”。 - most venerable sir
11
我正在使用VS Community 2017。ctrl+f5 不起作用,右键点击项目时没有属性(Properties)选项,同时 扳手图标(wrench icon)是灰色的。 - ksha
显示剩余7条评论

255

右键单击您的项目

属性 > 配置属性 > 链接器 > 系统

子系统 选项中选择 控制台 (/SUBSYSTEM:CONSOLE) 或者只需在文本字段中输入 Console

现在尝试运行它...应该可以工作了。


1
这对我的VS2013 Express有效,但被接受的答案却无效。非常奇怪,因为被接受的答案在我过去使用的所有Visual Studio版本中都有效。 - Michael Calvin
9
在进行这个设置后,你需要使用Ctrl + F5来运行,这是关键步骤。 - Jonathan Mee
正如@JonathanMee所说,您仍然需要运行Ctrl + F5。这已经在我的Visual Studio 2015中设置好了,因此第一个答案是最有帮助的。 - user7468879
这是确实正确的。如果您在空项目中添加新的C++文件,那么熟悉的“CTRL+F5”将会失败。 - user2023370
在Visual Studio Express 2015上对我有用。谢谢。 - Steven Lee
这在我的VS2022社区版中有效。 - Kartik Podugu

86

从Visual Studio 2017 (15.9.4)开始,有一个选项:

Tools->Options->Debugging->Automatically close the console

来自Visual Studio文档的相关片段:

调试停止时自动关闭控制台:

告诉Visual Studio在调试会话结束时关闭控制台。


7
我刚在VS2017和VS2019中测试过这个。它需要将子系统设置为"CONSOLE"并关闭此选项。只有其中一个或两者都没有的话,窗口会自动关闭。 - Casey
如果我从同一个解决方案中启动多个项目,这仍然会关闭窗口。 - Serge Rogatch
我觉得这是适用于VS 2017及以后版本的正确答案。可惜它不适用于旧版本。 - All The Rage
2
如何更改Makefile项目的子系统? - André van Schoubroeck
1
我发现如果调试一个C++控制台应用程序,其中命令参数重定向文件到标准输入(stdin),无论此选项的设置如何,窗口都会自动关闭。 - RainMoose
默认情况下,我在VS2022社区版中无法使用该选项,但控制台仍会自动关闭。@Viraj的答案对我有用。 - Kartik Podugu

45

以下是 C/C++ 的一种方法:

#include <stdlib.h>

#ifdef _WIN32
    #define WINPAUSE system("pause")
#endif

将以下代码放在程序顶部,如果它在Windows系统上(#ifdef _WIN32),则它会创建一个名为WINPAUSE的宏。每当您想要让程序暂停,请调用WINPAUSE;,它将使用DOS命令使程序暂停。对于其他像Unix / Linux这样的系统,控制台无论如何都不应在程序退出时退出。


这种方法在 Visual C++ 中不起作用(除非你包含一些头文件?) - wmac
2
@wmac 你必须包含 windows.h 头文件。 - Geowil
1
我没有包含任何库或命名空间,但它可以正确运行,非常感谢。 - Halil İbrahim Oymacı
在我的 Visual Studio 2013 Express 上运行良好。 :) - Anirban
1
不需要创建宏,只需调用system("pause")即可。如果您必须在其他系统上使用它,请将其包含在#ifdef中。 - Dan
只需使用getchar()std::cin.get(),没有必要通过系统调用调用特定于平台的可执行文件。 - Dan Bechard

35

进入调试菜单 -> 按下 无调试启动


1
这在 VS 2008 中甚至不是一个选项,除非选择了 C# 开发环境。但 CTRL + F5 可以工作。你也可以通过“工具”>“自定义”将其添加为工具栏上的按钮。 - perry
如果您有多个项目,请将相关项目设置为启动项目。 - CAD bloke

34

如果你在使用.NET,需要将Console.ReadLine()放在程序结尾前面。

它会等待<ENTER>键。


12
要么如此,要么使用Console.ReadKey()等待任意按键。 - Fredrik Mörk
奇怪,这在我的应用程序中没有任何效果。它仍然在没有等待用户输入的情况下关闭。 - Kokodoko
4
那么你的代码很可能在到达那个点之前就已经退出了。 - Indeed
如果你正在运行测试,这不是一个好的解决方案,因为它们会导致你的测试挂起并永远无法退出。 - kpaul

16

试着在main()函数返回之前调用getchar()函数。


简单的Hello Name控制台应用程序在VS 2008中无法工作。cout,cin,cout,getchar()和console仍然关闭。怎么回事? - perry
1
如果在getchar()之前有一个cout,请尝试将其放置两次。getchar()期望获得一个字符,而你已经使用cout给出了... 如果这样做有帮助,请告诉我 :) - Magarusu

12

(/SUBSYSTEM:CONSOLE)对于我的vs2013没有起作用(我已经拥有它)。

"无调试运行"不是一个选项,因为我不想在调试和查看输出之间切换。

最后我使用了:

int main() {
  ...
#if _DEBUG
  LOG_INFO("end, press key to close");
  getchar();
#endif // _DEBUG
  return 0;
}

在Qt Creator 2.6之前使用的解决方案。现在虽然Qt正在不断发展,但VS正在另一条道路上前进。据我记得,在VS2008中我们不需要使用这样的技巧。


8
只需将以下代码放在您的最后一行即可:
system("pause");

7
以下是翻译的结果:

这里有一个解决方案,它 (1) 不需要进行任何代码更改或断点调试, (2) 在程序终止后暂停,因此您可以看到打印的所有内容。它将在按下 F5 或 Ctrl+F5 后暂停。主要的缺点是在 VS2013 Express(经过测试)中,它不会加载符号,因此调试非常受限制。

  1. Create a batch file. I called mine runthenpause.bat, with the following contents:

    %1 %2 %3 %4 %5 %6 %7 %8 %9
    pause
    

    The first line will run whatever command you provide and up to eight arguments. The second line will... pause.

  2. Open the project properties | Configuration properties | Debugging.

  3. Change "Command Arguments" to $(TargetPath) (or whatever is in "Command").
  4. Change "Command" to the full path to runthenpause.bat.
  5. Hit OK.
现在,当您运行runthenpause.bat时,它将启动您的应用程序,并在应用程序终止后暂停,以便您查看控制台输出。
如果我找出如何加载符号,我会发布更新。我尝试了这个,但没有成功。

2
这仍然不支持调试,但至少解决了无法看到输出(例如VLD)的问题,与所有其他答案形成对比。 - Martin Hennings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接