我刚开始学习 c++,在阅读 http://www.dev-hq.net/c++/1--the-basics 年的 c++ 教程时,我发现在某些文本编辑器中编写 C++ 程序与用 Visual C++ 编写程序不同。它说"在大多数情况下,视觉C++将需要某种应用程序在'main'功能结束之前暂停,因为它会生成一个在执行后消失的窗口"。这是什么意思?
简短回答:这不是强制性的。该站点建议,以便在程序退出(从而关闭窗口)之前可以看到控制台窗口中的输出。
详细回答:如果使用 IDE 开发没有 GUI 的 C++ 或 C 程序,则 IDE 将通过启动控制台/终端窗口(也称为命令提示符)来显示输出。此窗口在程序启动时显示,并在程序结束时立即关闭。假设你只是打印"Hello,world!"并且没有任何停顿,终端窗口将打开,显示Hello,world!并立即关闭,所有这些都在眨眼之间完成。因此,习惯上在最后插入停顿。并非所有 IDE 都出现此问题;有些在其自己的积分窗口中显示输出,有些通过脚本插入暂停行为等。
需要理解的是,这只是使窗口停留的黑客攻击,从程序的角度来看,进行阻止调用是无用的。也不要使用system("pause");
因为它有问题,除了它不便携并且仅适用于 Windows 平台之外。
#include <iostream>
#include <limits>
int main()
{
std::cout << "Press ENTER(s) to exit...";
// flush data in cin's buffer
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
// blocking call to fresh input from user
std::cin.get();
}
这将是一种便携式方式,即无论您使用哪种平台,它都可以工作。
另一种方法是使用
getchar
(不是类似名称的getch
),这是ISO C标准规定的可移植的,但它有其怪癖。另一种方法是按照 Raja 的建议放置断点。它还会让你在学习调试器时感到困惑,调试器是编程中必不可少的工具。
要完全避免此问题,请从控制台窗口自行运行程序。虽然有时对于初学者来说可能会有点乏味,但手动编译代码并在没有 IDE 的情况下自己运行它会为您提供更多的见解,并且是一种很好的学习体验。
我仍然建议手动编译或调试断点方法,而不是在程序中注入假的暂停/阻塞调用;请注意,从用户那里收到的输入只是被忽略,并且从未在程序中进一步使用,因此从程序的角度来看是多余的,因此建议不要使用它。
当你使用"运行项目"(经典的视觉对象C++键绑定中的 Ctrl+F5,而不仅仅是 F5,即"调试项目")时,Visual Studio 将保持控制台窗口打开,直到你按下按钮。
只有当您使用"调试项目"时,它才不会。这是有道理的,因为当您实际寻找问题时,您通常只想使用该选项(启动和关闭时间更长,运行速度更慢),在这种情况下,您可能在程序中设置了断点,并且可以简单地在main()
的最后一行设置一个断点。
因此,所有提出的解决方法,以及关于Visual Studio的火焰,都是不必要的和错误的。
这只是意味着可执行窗口将在完成执行后立即关闭。
我建议在return 0;
之前使用标准库中的简单getchar();
语句(<iostream>
或<stdio.h>
标头)。 这意味着您必须按一个键才能关闭窗口。 正如您提到的Visual C++,system("pause");
在Windows系统上返回之前也可以正常工作。
当然,如果您较早地从 main 返回(常见于错误代码、未处理的异常或某处的退出调用),您可能不会进入该暂停机制。 由于您刚刚开始,因此您现在不太可能遇到这些东西。
从命令行运行程序也可以查看输出。
以下是我用来暂停控制台应用程序并让我查看结果的内容:
void waitForUser()
{
// if for some reason cin is in invalid state
// we need to clear it
std::cin.clear();
// if we used cin to input something it is likely to
// contain trailing n symbols , we need to get rid of them
std::cin.ignore( std::cin.rdbuf()->in_avail() );
// we wait for a user to hit Enter here
std::cin.get();
}
只需在main
末尾调用此函数即可