是否有一行代码会终止程序?
像python的sys.exit()
?
答案 0 :(得分:26)
虽然可以调用exit()
(如果您的应用程序遇到致命错误,可能需要这样做),退出程序的最简洁方法是从{{1}返回}:
main()
当您调用int main()
{
// do whatever your program does
} // function returns and exits program
时,具有自动存储持续时间(本地变量)的对象在程序终止之前不会被销毁,因此您无法进行适当的清理。这些对象可能需要清理它们拥有的任何资源,保留任何挂起的状态更改,终止所有正在运行的线程,或执行其他操作以使程序干净地终止。
答案 1 :(得分:19)
#include <cstdlib>
...
exit( exit_code );
答案 2 :(得分:7)
有几种方法可以使程序终止。哪一个是合适的取决于您希望程序终止的原因。绝大部分时间都应该在main函数中执行return语句。如下所示。
int main()
{
f();
return 0;
}
正如其他人已经确定的那样,这样可以正确地破坏所有堆栈变量,以便正确清理。这非常重要。
如果您在代码深处某处检测到错误,并且需要退出,则应抛出异常以返回main函数。如下所示。
struct stop_now_t { };
void f()
{
// ...
if (some_condition())
throw stop_now_t();
// ...
}
int main()
{
try {
f();
} catch (stop_now_t& stop) {
return 1;
}
return 0;
}
这会导致堆栈被解除所有要被破坏的堆栈变量。仍然非常重要。请注意,使用非零返回值指示失败是合适的。
如果在不太可能的情况下,您的程序检测到一个条件,表明执行更多语句不再安全,那么您应该使用std :: abort()。这将使您的程序突然停止,无需进一步处理。 std :: exit()是类似的,但可能会调用atexit处理程序,如果你的程序被充分borked可能会很糟糕。
答案 3 :(得分:4)
是的! exit()
。它位于<cstdlib>
。
答案 4 :(得分:3)
允许执行流程returning a value or allowing execution to reach the end of the function离main
是程序应该终止的方式,除非在不可恢复的情况下。在C ++中返回值是可选的,但我通常更喜欢返回在cstdlib中找到的EXIT_SUCCESS
(一个特定于平台的值,表示程序已成功执行)。
#include <cstdlib>
int main(int argc, char *argv[]) {
...
return EXIT_SUCCESS;
}
但是,如果您的程序达到不可恢复状态,则应该抛出异常。然而,重要的是要意识到这样做的含义。没有广泛接受的最佳实践来决定什么应该或不应该是一个例外,但是你需要注意一些一般规则。
例如,从析构函数中抛出异常几乎总是一个可怕的想法,因为被破坏的对象可能已经被破坏,因为已经抛出异常。如果抛出第二个异常,则调用terminate
并且您的程序将暂停,而不执行任何进一步的清理。您可以使用uncaught_exception
来确定它是否安全,但通常更好的做法是永远不要让异常留下析构函数。
虽然通常总是可以调用但是没有写入的函数抛出异常(例如,如果new
无法分配足够的内存,std::bad_alloc
会抛出#include <stdexcept>
#include <cstdlib>
#include <iostream>
int foo(int i) {
if (i != 5) {
throw std::runtime_error("foo: i is not 5!");
}
return i * 2;
}
int main(int argc, char *argv[]) {
try {
foo(3);
}
catch (const std::exception &e) {
std::cout << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
),通常很难初学者程序员要跟踪甚至了解C ++中有关异常的所有特殊规则。出于这个原因,我建议只在没有合理的方法继续执行的情况下使用它们。
exit
abort
是来自C的保留,可能导致自动存储的对象无法正常清理。 terminate
和exit
有效地导致程序自杀,绝对不会清理资源。
无论您做什么,都不要使用例外abort
或terminate
/ {{1}}作为拐杖来绕过编写结构合理的程序。保存它们以适应特殊情况。
答案 5 :(得分:2)
如果你在主要职位,你可以这样做:
return 0;
或
exit(exit_code);
退出代码取决于代码的语义。 1是正常退出时的错误0。
在你的程序的其他一些功能中:
exit(exit_code)
将退出该程序。
答案 6 :(得分:0)
在main()中,还有:
return 0;
答案 7 :(得分:0)
#include <cstdlib>
...
/*wherever you want it to end, e.g. in an if-statement:*/
if (T == 0)
{
exit(0);
}
答案 8 :(得分:0)
此SO post提供了答案并解释了为什么不使用exit()的原因。值得一读。
简而言之,您应该在main()中返回0,因为它将运行所有析构函数并进行对象清除。如果您退出错误,也可以进行抛出。
答案 9 :(得分:0)
返回主目录,应返回EXIT_FAILURE,
或std :: terminate()(如果已损坏)。
(摘自Martin York的评论)
答案 10 :(得分:-1)
else if(Decision >= 3)
{
exit(0);
}
答案 11 :(得分:-4)
出口(0); //在关闭大括号之前的main函数结尾处
答案 12 :(得分:-4)
够简单..
退出(0); } //功能结束
确保0的两侧都有空格。如果没有空格,程序将不会停止。