防止控制台窗口在 Visual Studio C/C++ 控制台应用程序上关闭
Posted
技术标签:
【中文标题】防止控制台窗口在 Visual Studio C/C++ 控制台应用程序上关闭【英文标题】:Preventing console window from closing on Visual Studio C/C++ Console application 【发布时间】:2010-12-19 01:15:19 【问题描述】:这可能是一个令人尴尬的问题,因为毫无疑问答案是显而易见的。
我已经使用 Visual Studio 多年,但这是我第一次进行任何“控制台应用程序”开发。
当我运行我的应用程序时,控制台窗口会弹出,程序输出出现,然后窗口在应用程序退出时关闭。
有没有办法让它保持打开直到我检查了输出,或者在窗口关闭后查看结果?
【问题讨论】:
Monodevelop 符合您的预期。 【参考方案1】:由于从 VS 运行它会附加 VS 调试器,因此您可以检查附加的调试器:
if (Debugger.IsAttached)
Console.WriteLine("Debugger is attached. Press any key to exit.");
Console.ReadKey();
我想唯一需要注意的是,如果您附加任何其他调试器,它仍然会暂停,但这甚至可能是一种想要的行为。
【讨论】:
【参考方案2】:有时,不会改变您的设置或代码的简单 hack 可以是:
按 F9 设置断点,然后按 F5 执行 Debug。
【讨论】:
【参考方案3】:目前无法对在 WSL2 中运行的应用执行此操作。但是有两种解决方法:
调试窗口保留关闭的 WSL shell 窗口的内容。
如果您的应用程序返回非零返回码,则窗口保持打开状态,因此您可以在调试版本中返回非零值。
【讨论】:
【参考方案4】:转到设置>调试>取消选中关闭结束。
【讨论】:
【参考方案5】:右击你的项目
属性 > 配置属性 > 链接器 > 系统
在SubSystem
选项中选择Console (/SUBSYSTEM:CONSOLE),或者您可以在文本字段中输入Console!
现在试一试……应该可以了
【讨论】:
这适用于我的 VS2013 Express,但接受的答案没有。很奇怪,因为接受的答案适用于我过去使用的所有 Visual Studio 版本。 @MichaelCalvin 设置后你必须使用 Ctrl + F5 运行,这才是关键。 正如@JonathanMee 所说,您仍然运行 Ctrl + F5。这已经在我的 Visual Studio 2015 中设置好了,所以第一个答案是最有帮助的。 这确实是正确的。如果您将一个新的 C++ 文件添加到一个空项目中,那么熟悉的CTRL+F5
将会失败。
在 Visual Studio Express 2015 上为我工作。谢谢。【参考方案6】:
在程序结束时使用Console.ReadLine()
。这将使窗口保持打开状态,直到您按下 Enter 键。详情请见https://docs.microsoft.com/en-us/dotnet/api/system.console.readline。
【讨论】:
【参考方案7】:从 Visual Studio 2017 (15.9.4) 开始有一个选项:
Tools->Options->Debugging->Automatically close the console
来自Visual Studio documentation的对应片段:
调试停止时自动关闭控制台:
告诉 Visual Studio 在调试会话结束时关闭控制台。
【讨论】:
我刚刚在 VS2017 和 VS2019 中测试过这个。它需要将子系统设置为 CONSOLE 并关闭此选项。有一个或另一个或都不自动关闭窗口。 如果我从同一个解决方案启动多个项目,这仍然会为我关闭窗口。 我觉得这是 VS 2017 及以后的正确答案。太糟糕了,它不在旧版本中。 如何更改 Makefile 项目的子系统?【参考方案8】:就我而言,我在 VS 2017 社区版上创建了一个 Empty C++ 项目时遇到了这种情况。您需要在配置属性下将子系统设置为“控制台 (/SUBSYSTEM:CONSOLE)”。
-
转到“查看”,然后选择“物业经理”
右键单击项目/解决方案并选择“属性”。这将打开一个测试属性页面
导航到链接器,然后选择“系统”
点击“子系统”,出现下拉菜单
选择“控制台 (/SUBSYSTEM:CONSOLE)”
应用并保存
下次使用“CTRL +F5”运行代码时,您应该会看到输出。
【讨论】:
【参考方案9】:您也可以使用此选项
#include <conio.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main()
.
.
.
getch();
return 0;
【讨论】:
【参考方案10】:任意使用:
cin.get();
或
system("pause");
确保在main()
函数的末尾和return
语句之前创建它们中的任何一个。
【讨论】:
【参考方案11】:只要把你的最后一行代码:
system("pause");
【讨论】:
【参考方案12】:一个更好的解决方案:
atexit([] system("PAUSE"); );
在程序的开头。
优点:
可以使用 std::exit() 可以从 main 有多个返回 您可以在调试器下运行您的程序 独立于 IDE(+ 独立于操作系统,如果您使用cin.sync(); cin.ignore();
技巧而不是 system("pause");
)
缺点:
必须修改代码 不会在 std::terminate() 上暂停 仍会在 IDE/调试器会话之外的程序中发生;您可以在 Windows 下使用以下方法防止这种情况:extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv)
if (IsDebuggerPresent())
atexit([] system("PAUSE"); );
...
【讨论】:
非常糟糕的建议。 你能详细说明原因吗? 在不调试的情况下它没有任何用处,因为在这种情况下没有需要解决的问题。在VS里只要按Ctrl+F5运行程序就行了,所以VS里没问题,在命令解释器里也没问题,总之没问题。在调试过程中想要停止的情况下,添加代码停止不是比断点更方便的解决方案,并且会干扰不想停止的情况。【参考方案13】:Visual Studio 2015,带有导入。因为我讨厌 当代码示例没有提供所需的导入时。
#include <iostream>;
int main()
getchar();
return 0;
【讨论】:
【参考方案14】:这是 C/C++ 的一种方式:
#include <stdlib.h>
#ifdef _WIN32
#define WINPAUSE system("pause")
#endif
将它放在程序的顶部,如果它在 Windows 系统上 (#ifdef _WIN32
),那么它将创建一个名为 WINPAUSE
的宏。每当你想让你的程序暂停时,调用WINPAUSE;
,它会使用DOS命令暂停程序。对于 Unix/Linux 等其他系统,控制台不应在程序退出时退出。
【讨论】:
此方法在 Visual C++ 中不起作用(除非包含一些标头?) @wmac 你必须包含 windows.h 标头 我没有包含任何库或命名空间,但它运行正常,非常感谢。 在 Visual Studio 2013 Express 上为我工作。 :) 不需要创建宏——只需调用system("pause")。如果您必须在其他系统上使用它,请用#ifdef 将其括起来。【参考方案15】:这是一个解决方案,(1) 不需要任何代码更改或断点,并且 (2) 在程序终止后暂停 以便您可以看到 所有内容打印。它将在 F5 或 Ctrl+F5 之后暂停。主要缺点是在 VS2013 Express(经过测试)上,它不加载符号,因此调试非常受限。
创建一个批处理文件。我打电话给我的runthenpause.bat
,内容如下:
%1 %2 %3 %4 %5 %6 %7 %8 %9
pause
第一行将运行您提供的任何命令和最多八个参数。第二行将...暂停。
打开项目属性 |配置属性 |调试。
将“命令参数”更改为$(TargetPath)
(或“命令”中的任何内容)。
将“Command”更改为runthenpause.bat
的完整路径。
点击确定。
现在,当您运行时,runthenpause.bat
将启动您的应用程序,并在您的应用程序终止后暂停,以便您查看控制台输出。
如果我知道如何加载符号,我会发布更新。我按照this 尝试了/Z7
,但没有成功。
【讨论】:
这仍然不支持调试,但至少它解决了无法看到输出的问题,例如的 VLD,与 所有 其他答案相比。【参考方案16】:只需按 CNTRL + F5 即可在外部命令行窗口中打开它(Visual Studio 无法控制它)。
如果这不起作用,请在代码末尾添加以下内容:
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
这将等待您在代码到达末尾后按一个键关闭终端窗口。
如果您想在多个地方执行此操作,请将上述代码放在一个方法中(例如private void Pause()
),并在程序到达可能结束时调用Pause()
。
【讨论】:
当我执行 cntrl+f5 时它会打开然后立即关闭?你如何解决这个问题? 当我按下 Ctrl + F5 时,什么也没有发生。它曾经对我有用,但突然之间,它停止了工作。【参考方案17】:(/SUBSYSTEM:CONSOLE) 不适用于我的 vs2013(我已经有了)。
“运行而不调试”不是一个选项,因为我不想在调试和查看输出之间切换。
我结束了
int main()
...
#if _DEBUG
LOG_INFO("end, press key to close");
getchar();
#endif // _DEBUG
return 0;
qtcreator pre 2.6 中使用的解决方案。现在,当 qt 正在增长时,vs 正在走其他路。我记得,在 vs2008 中我们不需要这些技巧。
【讨论】:
【参考方案18】:尝试在main()
返回之前调用getchar()
。
【讨论】:
对于简单的 Hello Name 控制台应用程序在 VS 2008 中不起作用。 cout、cin、cout、getchar()、控制台仍然关闭。有什么关系? 如果您在 getchar() 之前有一个 cout,请尝试将 getchar() 放入两次。 getchar() 需要一个字符,而你已经用 cout 给它了...如果这有帮助,请告诉我:)【参考方案19】:转到调试菜单->按下 StartWithoutDebugging
【讨论】:
这在 VS 2008 中甚至不是一个选项,除非选择了 C# 开发环境。 CTRL + F5 虽然有效。您还可以通过“工具”>“自定义”将其作为按钮添加到工具栏。 如果您有多个项目,请将相关的一个设置为启动项目【参考方案20】:添加“|暂停”在项目属性调试部分下的命令参数框中。
【讨论】:
如果可行,这将是一个很好的解决方案。pause
似乎只在批处理文件中工作,虽然它在 STDIN 上从您的程序接收输入,但它不会重新打印该文本。我尝试用&&
替换|
,但没有效果——大概是因为它没有使用命令shell (cmd.exe) 执行。【参考方案21】:
您可以从命令提示符运行您的可执行文件。这样你就可以看到所有的输出。或者,您可以这样做:
int a = 0;
scanf("%d",&a);
return YOUR_MAIN_CODE;
这样,在您输入 a
变量的数据之前,窗口不会关闭。
【讨论】:
【参考方案22】:如果您使用的是 .NET,请将Console.ReadLine()
放在程序结束之前。
它将等待<ENTER>
。
【讨论】:
+1 - 或者Console.ReadKey()
等待任何键。
很奇怪,这对我的应用没有影响。它仍然会在不等待用户输入的情况下关闭。
那么你的代码很可能在到达那个点之前就退出了。
如果您正在运行测试,这不是一个很好的解决方案,因为它们会导致您的测试挂起并且永远不会退出。【参考方案23】:
如果您在没有调试的情况下运行 (Ctrl+F5),则默认情况下会提示您按回车键关闭窗口。如果你想使用调试器,你应该在最后一行下一个断点。
【讨论】:
如果您有一个 C++ 应用程序并且在不调试的情况下运行并且控制台窗口仍然关闭,您需要记住在配置属性/链接器/系统下将子系统显式设置为控制台。如果您从一个空项目开始,这可能会发生这种情况,这会导致子系统未设置。 对我不起作用 :( 控制台窗口会立即打开和关闭,但日志会暂停并等待再次按 F5 正确答案是@TrevorRobinson 的答案:如果您无法找到配置属性的位置,这里是扩展版本:在 Visual Studio 中右键单击您的项目 > 属性 > 配置属性 >链接器>系统,将子系统更改为“控制台” 特雷弗·罗宾逊是对的。如果你开始一个空白项目,和 C++ 项。你需要去查看->属性管理器->属性(扳手图标)->配置。 Properties->Linker->System->Subsystem->在弹出的菜单中选择Console。 我在 VS 社区 2017 工作。ctrl+f5
不工作,当我右键单击项目时没有 Properties
,wrench icon
也是灰色的。以上是关于防止控制台窗口在 Visual Studio C/C++ 控制台应用程序上关闭的主要内容,如果未能解决你的问题,请参考以下文章
在Visual Studio中编码c ++时消失的控制台窗口