什么是打击控制台closures问题的最佳做法?

编译控制台程序后,控制台窗口在运行后立即closures。 保持开放的最佳做法是什么? 我search谷歌加载,我习惯了代码块,你不必担心它,但是,我想用VS和VS混淆,我的控制台closures。 整个interwebz有几种不同的方式来保持它的开放,但是,我已经读到,其中大多数是不好的编码技术。 大家喜欢什么方法?

当我使用Visual Studio,而且我不需要debugging时,只需使用Ctrl + F5按键来运行它,并防止控制台closures。

由于您总是在debugging器中运行,因此在main()的return语句上设置一个断点。

debugging器是你最好的朋友,学习(学习早),利用它在每一个机会你的优势。

在控制台中运行你的程序,这将是运行控制台程序的预期方式。

或者,您可以制作一个batch file来执行您的程序,该程序将具有:

 REM batch file to launch program yourprogram.exe PAUSE 

并且PAUSE cmd.exe命令将要求用户按任意键。

cin是非常不雅的,但容易忘记派生:

 { char c; std::cin >> c; } 

直到你input一个字符/ *编辑* /并按回车键,窗口才会打开。

std::cin.get()会在你input一个字符的那一刻closures窗口,这取决于你习惯了多容易,冒着“哎呀,我希望我没有closures它”的风险稍大一些。 比operator>>(istream &)operator>>(istream &)

这两者都不同于system("pause") ,因为它们以程序可访问的方式返回所键入的字符的值,所以,如果不常发生,一个kludge会导致另一个kludge,您可以根据你input的内容(例如)立即退出,将一些值写入日志,再次运行等等。

我倾向于使用system("PAUSE"); 这给你一个

Press any key to continue . . .

信息。

我用:

 cin.get() 

我听说它比系统(“PAUSE”)的成本更低,而且它也可以在POSIX系统上运行。 有一个伟大的链接 ,详细介绍了这一点。

抵制诱惑做任何事情。 行为良好的命令行程序在完成运行后通过退出代码报告状态时退出。 这使他们能够在自动化环境中成为脚本和“好公民”。 即使在交互式环境中,为什么只是因为您的debugging环境而迫使用户进行额外的按键操作呢?

如果运行而不是debugging,Visual Studio将打开一个控制台窗口,在应用程序退出后暂停,以便仍然可以查看输出。 我不知道为什么当你debugging时行为是不同的,也许是因为你有断点可用,所以如果你想在各个阶段看到输出,你可以在相关的输出语句之后放置断点,或者在main或end “停止exception抛出”选项。

不pipe是什么原因,我从来没有想过为了增强我的debugging体验而不得不妥协我的应用程序的行为。

一个非常普通的方法就是在主应用程序代码closures后,在代码中从控制台读取一个密钥。 刚才读入的按键会被丢弃,但是它保持着控制台的打开状态。

这不是很漂亮,但是我经常用debugging定义包装,所以在debugging过程中,控制台保持打开状态。 在发布期间,我通常不会在VS中运行,而从命令行运行时,这不再是问题。

这个线程中的“不这样做”的反应可能看起来很简单,但是它们相当明智。 我遇到过这个问题,因为我正在debugging一个运行良好的gtest套件,但是现在在启动时神秘崩溃。 当从控制台运行时,它popup一个对话框,说“blah.exe已停止工作”; 但是当从debugging器运行时,控制台瞬间popup,消失,程序以0状态退出。

我应该一直在思考这种行为差异是多么的奇怪,但是我却是这样想的:“呃,伙计 – 我得让那个控制台窗口保持在原来的位置,这样我才能看到它说的是什么。 对?

事实certificate,我正在工作的机器(我的一个同事)的debugging器的“命令参数”设置为“–gtest_filter = * testMsg *”。 我也注意到了这一点,但是我从来没有想到,所有匹配filter的testing都在最近的提交中被重命名了。 所以,从debugging器启动时,gtest没有find任何testing运行,只是退出。 我的另一个90分钟,我永远不会回来。 (-_-)如果我的下意识的反应不是认为我需要控制台窗口保持打开状态来解决问题,我可以很快地放弃这个焦油宝宝…

在main函数返回之前调用这个函数:

 void onEnd() { printf("Press any key to exit..."); _getch(); }