可能重复:
How to stop C++ console application from exiting immediately?
我在学习C ++时刚开始使用Visual Studio 2010。当我编译并运行我的代码时,我简要地看到命令提示符出现在屏幕上,然后消失,并在调试器中看到以下内容,无论我在.cpp
文件中写了什么。
'c++ lessons.exe': Loaded 'C:\Users\User\Documents\Visual Studio 2010\Projects\c++ lessons\Debug\c++ lessons.exe', Symbols loaded.
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Symbols loaded.
'c++ lessons.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded.
The program '[5904] c++ lessons.exe: Native' has exited with code 0 (0x0).
我已经做了一些搜索,试图为自己找到一个解决方案。但是,大多数建议涉及黑客,如添加暂停或等待输入,我尝试 Ctrl + F5 。有没有办法可以设置构建和放大在Visual Studio中运行进程以显示命令提示符?
答案 0 :(得分:3)
在main()
的右大括号设置断点。
答案 1 :(得分:2)
转到Project->Properties->Configuration Properties->Debugging
在命令字段中,键入:“cmd.exe
”
在“命令参数”字段中,键入:“\k $(TargetPath)
”
答案 2 :(得分:0)
您可以向“工具”菜单添加命令,并将其输出重定向到输出窗口中的选项卡。你可以使用项目特定的宏作为命令的一部分,所以也许有一些小问题,你可以创建一个运行你的程序的工具(cmd /c "$(OutputPath)"
可能会这样做,我想? - 我没有VS方便)并将其输出打印到输出窗口。但是,这不允许您在调试器下运行它。
我发现的最佳解决方案就是吸收它。战斗Visual Studio是浪费精力,因为Visual Studio总是赢。但是你可以让自己的生活更轻松。添加以下功能:
void pause() {
if(IsDebuggerPresent()) {
printf("press enter.\n");
getchar();
}
}
然后在启动时将其注册为atexit
函数(因为如果有人调用exit
而不是从main返回,你会希望调用它):
atexit(&pause);
然后,第一次运行程序,并在“按Enter”提示符等待时,转到控制台的属性并设置9,999行向后滚动。 (我还建议使用“快速编辑”模式和较小的字体,但这取决于您。)然后,当您单击“应用”时,选择“为具有相同标题的未来控制台窗口保存这些选项”。
这样,在后续运行中,你将拥有一个漂亮的大型滚动缓冲区,相当简单的copy'n'paste,并且在程序运行成功完成后,命令提示符不会立即消失。
是的,我知道这是你不想要的暂停解决方案! - 但我从来没有发现任何更好的东西,而且,就目前而言,它运作正常。
另一种可以与上述方法结合使用的方法是使用以下函数,并尽可能使用它而不是printf
:
void xprintf(const char *fmt, ...) {
char buf[16384];//16K - tweak to taste
va_list v;
va_start(v, fmt);
if(IsDebuggerPresent()) {
_vsnprintf(buf, sizeof buf, fmt, v);
buf[sizeof buf - 1] = 0;//_vsnprintf is odd
OutputDebugString(buf);
fputs(stdout, buf);
} else {
vprintf(fmt,v);
}
va_end(v);
}
现在你的程序打印的任何内容都将转到输出窗口,并且(直到你厌倦了输出窗口的传奇树懒,并删除OutputDebugString
调用,或者更有选择地调用xprintf
... )即使在程序运行结束后,您也可以看到程序的输出。
(就个人而言,我一起使用所有这些。我不明白为什么VS的输出窗口太慢,我不明白它为什么不捕获stdout / stderr,但是因为我已经决定使用以上,我发现它不那么麻烦。结果并不是很好,但是你已经习惯了,它已经足够容忍了。)