防止在Visual Studio C / C ++控制台应用程序上closures控制台窗口
这可能是一个尴尬的问题,毫无疑问,答案是非常明显的。
我已经使用了Visual Studio多年,但这是我第一次完成任何“控制台应用程序”开发。
当我运行我的应用程序时,popup控制台窗口,出现程序输出,然后窗口在应用程序退出时closures。
有没有办法保持它打开,直到我已经检查输出,或在窗口closures后查看结果?
如果你在没有debugging的情况下运行(Ctrl + F5),那么默认情况下会提示你按回车closures窗口。 如果你想使用debugging器,你应该在最后一行放置一个断点。
右键点击你的项目
属性>configuration属性>链接器>系统
在SubSystem
选项中select控制台(/ SUBSYSTEM:CONSOLE)。
现在尝试一下…它应该工作
这是C / C ++的一个方法:
#include <stdlib.h> #ifdef _WIN32 #define WINPAUSE system("pause") #endif
把它放在程序的顶部,如果它在Windows系统上( #ifdef _WIN32
),那么它将创build一个名为WINPAUSE
的macros。 每当你想让程序暂停时,调用WINPAUSE;
它将使用DOS命令暂停程序。 对于其他系统如Unix / Linux,控制台不应该退出程序退出。
转到debugging菜单 – > 按 StartWithoutDebugging
如果您使用.NET,请在程序结束之前放置Console.ReadLine()
。
它将等待<ENTER>
。
尝试在main()
返回之前调用getchar()
。
(/ SUBSYSTEM:CONSOLE)没有为我的vs2013工作(我已经有了它)。
“没有debugging运行”不是一个选项,因为我不想在debugging和看到输出之间切换。
我结束了
int main() { ... #if _DEBUG LOG_INFO("end, press key to close"); getchar(); #endif // _DEBUG return 0; }
在qtcreator 2.6以前使用的解决scheme。 现在,当qt增长的时候,vs正在走另一条路。 我记得,在vs2008中,我们并不需要这样的技巧。
这里有一个解决scheme,(1)不需要任何代码改变或断点,(2) 程序终止后暂停,以便你可以看到打印的所有东西 。 它将在F5或Ctrl + F5之后暂停。 主要的缺点是在VS2013 Express(经testing),它不加载符号,所以debugging非常有限。
-
创build一个batch file。 我叫
runthenpause.bat
,内容如下:%1 %2 %3 %4 %5 %6 %7 %8 %9 pause
第一行将运行您提供的任何命令和最多八个参数。 第二行将…暂停。
-
打开项目属性| configuration属性| debugging。
- 将“Command Arguments”更改为
$(TargetPath)
(或“Command”中的任何内容)。 - 将“Command”更改为
runthenpause.bat
的完整path。 - 点击确定。
现在,当你运行的时候, runthenpause.bat
会启动你的应用程序,并且在你的应用程序终止之后,会暂停你看到控制台的输出。
我会发布更新,如果我弄清楚如何获得符号加载。 我试过/Z7
,但没有成功。
您可以从命令提示符运行您的可执行文件。 这样你可以看到所有的输出。 或者,你可以做这样的事情:
int a = 0; scanf("%d",&a); return YOUR_MAIN_CODE;
这样窗口就不会closures,直到你inputa
variables的数据。
添加“| 暂停“在项目属性的debugging部分下的命令参数框中。
只需按下CNTRL + F5在外部命令行窗口中打开它(Visual Studio不能控制它)。
如果这不起作用,那么将以下内容添加到代码的末尾:
Console.WriteLine("Press any key to exit..."); Console.ReadKey();
一旦代码结束,等待您按下一个键closuresterminal窗口。
如果你想在多个地方做到这一点,把上面的代码放在一个方法(例如private void Pause()
)中,并在程序到达可能结束时调用Pause()
。
Visual Studio 2015与import 。 因为我讨厌代码示例不提供所需的import。
#include <iostream>; int main() { getchar(); return 0; }
一个更好的解决scheme:
atexit([] { system("PAUSE"); });
在你的节目开始。
优点:
- 可以使用std :: exit()
- 可以有多个从主返回
- 你可以在debugging器下运行你的程序
- IDE独立(+操作系统独立,如果你使用
cin.sync(); cin.ignore();
技巧而不是system("pause");
)
缺点:
- 必须修改代码
- 不会在std :: terminate()上暂停
- 在IDE /debugging器会话之外的程序中仍然会发生; 你可以使用下面的方法来防止这个:
extern "C" int __stdcall IsDebuggerPresent(void); int main(int argc, char** argv) { if (IsDebuggerPresent()) atexit([] {system("PAUSE"); }); ... }
使用console.readline
。 你正在写行,但没有阅读。