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

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

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

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

是否有一种方法可以让它一直打开直到我检查输出,或者在窗口关闭后查看结果?

532495 次浏览

如果你使用的是。net,在程序结束前加上Console.ReadLine()

它将等待<ENTER>

如果你运行时没有调试(Ctrl+F5),那么默认情况下它会提示你按回车键关闭窗口。如果要使用调试器,应在最后一行上放置断点。

您可以从命令提示符运行可执行文件。这样您就可以看到所有的输出。或者,你可以这样做:

int a = 0;
scanf("%d",&a);


return YOUR_MAIN_CODE;

这样,直到你为a变量输入数据,窗口才会关闭。

在项目属性的调试部分的命令参数框中添加“| pause”。

在程序末尾使用Console.ReadLine()。这将保持窗口打开,直到你按下输入键。详见https://learn.microsoft.com/en-us/dotnet/api/system.console.readline

下面是C/ c++的一种方法:

#include <stdlib.h>


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

把它放在程序的顶部,如果它是在Windows系统(#ifdef _WIN32)上,那么它将创建一个名为WINPAUSE的宏。当你想暂停程序时,调用WINPAUSE;,它将使用DOS命令暂停程序。对于Unix/Linux等其他系统,控制台不应该在程序退出时退出。

去调试菜单->新闻 StartWithoutDebugging . exe

右键单击您的项目

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

SubSystem选项中选择控制台(/子系统:控制台),或者你可以在文本字段中输入控制台 !

现在试试……应该可以

尝试在main()返回之前调用getchar()

(/子系统:控制台)不为我的vs2013工作(我已经有了它)。

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

我以

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

qtcreator pre 2.6中使用的解决方案。qt在增长,vs在相反方向。我记得,在vs2008中我们不需要这样的技巧。

只需按CNTRL + F5在外部命令行窗口中打开它(Visual Studio无法控制它)。

如果这不起作用,那么在代码的末尾添加以下代码:

Console.WriteLine("Press any key to exit...");
Console.ReadKey();

这等待你按下一个键关闭终端窗口一旦代码已经结束。

如果你想在多个地方这样做,把上面的代码放在一个方法中(例如private void Pause()),并在程序到达可能的结束时调用Pause()

这里有一个解决方案,它(1)不需要任何代码更改或断点,(2)暂停程序终止后,以便您可以看到打印的一切。它会在F5或Ctrl+F5后暂停。主要的缺点是在VS2013 Express上(根据测试),它不加载符号,所以调试非常受限。

  1. 创建批处理文件。我把我的命名为runthenpause.bat,内容如下:

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

    第一行将运行您提供的任何命令和最多8个参数。第二行将…暂停。< / p >

  2. 打开项目属性|配置属性|调试。

  3. 将“命令参数”更改为$(TargetPath)(或“命令”中的任何内容)。
  4. 将“Command”更改为runthenpause.bat的完整路径。
  5. 点击确定。

现在,当你运行时,runthenpause.bat将启动你的应用程序,在你的应用程序终止后,它将暂停让你看到控制台输出。

我将张贴更新,如果我弄清楚如何获得的符号加载。我尝试了/Z7每个,但没有成功。

Visual Studio 2015,与进口。因为我讨厌 当代码示例没有给出所需的导入时

#include <iostream>;


int main()
{
getchar();
return 0;
}

一个更好的解决方案:

atexit([] { system("PAUSE"); });

在程序开始的时候。

优点:

  • 可以使用std::exit()
  • 可以从主有多个返回
  • 您可以在调试器下运行程序
  • IDE独立(+ OS独立,如果你使用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"); });
...
}

只需要在最后一行代码中输入:

system("pause");

要么使用:

  1. cin.get();

  1. system("pause");

确保在main()函数的末尾和return语句之前设置它们中的任何一个。

您也可以使用此选项

#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;
}

在我的情况下,当我在VS 2017社区版上创建一个空c++项目时,我经历了这一点。您需要在配置属性下将子系统设置为“Console(/子系统:Console)”。

  1. 转到“查看”,然后选择“物业管理”
  2. 右键单击项目/解决方案并选择“属性”。这将打开Test属性页
  3. 导航到链接器,然后选择“系统”
  4. 点击“子系统”,会出现一个下拉框
  5. 选择“控制台(/子系统:控制台)”
  6. 应用并保存
  7. 下次使用“CTRL +F5”运行代码时,应该会看到输出。

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

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

Visual Studio文档中对应的片段:

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

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

进入Setting>Debug> uncheck close on end。

enter image description here

目前,在WSL2中运行的应用程序无法做到这一点。但是有两种变通方法:

  1. 调试窗口保留已关闭的WSL shell窗口的内容。

  2. 如果您的应用程序返回非零返回代码,则窗口将保持打开状态,因此您可以在调试版本中返回非零。

有时候,一个简单的不改变你的设置或代码的黑客可以:

用F9设置断点,然后用F5执行Debug。

因为从VS运行它会附加VS调试器,你可以检查附加的调试器:

if (Debugger.IsAttached)
{
Console.WriteLine("Debugger is attached. Press any key to exit.");
Console.ReadKey();
}

我想唯一需要注意的是,如果附加任何其他调试器,它仍然会暂停,但这甚至可能是一种需要的行为。

应该补充的是,从那时起情况已经发生了变化。在Windows 11(可能是10,我不能再检查了)上,新的终端应用程序现在包含各种控制台,PowerShell和其他会话,有自己的关闭设置。在Settings >违约比;先进的祝辞配置文件终止行为。

如果它被设置为当程序以0退出时关闭,那么它将关闭,即使VS被告知相反的情况。