exit()
或者只是return
语句在main()
函数中有什么区别吗?个人而言,我更喜欢使用
return
语句,因为我觉得它就像阅读其他函数一样,代码的流程控制在我阅读时更加顺畅(在我看来)。而且,即使我想重构main()
函数,使用return
似乎比exit()
更好的选择。
exit()
有什么特殊功能,return
没有吗?exit()
或者只是return
语句在main()
函数中有什么区别吗?return
语句,因为我觉得它就像阅读其他函数一样,代码的流程控制在我阅读时更加顺畅(在我看来)。而且,即使我想重构main()
函数,使用return
似乎比exit()
更好的选择。
exit()
有什么特殊功能,return
没有吗?实际上,有一个细微的区别。这对C++来说更有意义,但这些差异很重要。
当我在main()
中调用return
时,我的局部作用域对象将被调用析构函数。如果我调用exit()
,则不会为我的局部作用域对象调用析构函数! 请重新阅读一遍。 exit()
不会返回。 这意味着一旦我调用它,就没有“后悔药”。您在该函数中创建的任何对象都不会被销毁。通常这没有影响,但有时会有影响,比如关闭文件(您肯定希望将所有数据刷新到磁盘上吧?)。
请注意,即使您调用exit()
,静态对象也将被清除。最后请注意,如果使用abort()
,则不会销毁任何对象。也就是说,没有全局对象、静态对象和局部对象将调用其析构函数。
在喜欢exit
而不是return
时,请小心谨慎。
http://groups.google.com/group/gnu.gcc.help/msg/8348c50030cfd15a
另一个区别是:exit
是标准库函数,因此您需要包含头文件并链接标准库。为了说明(以C ++为例),这是一个有效的程序:
int main() { return 0; }
不过如果要使用exit
,你需要引入一个头文件:
#include <stdlib.h>
int main() { exit(EXIT_SUCCESS); }
此外,这增加了一个额外的假设:从main
调用exit
具有与返回零相同的副作用。正如其他人指出的那样,这取决于您正在构建哪种可执行文件(即谁在调用main
)。您是编写使用C运行时的应用程序吗?Maya插件?Windows服务?驱动程序?每种情况都需要研究以查看exit
是否等效于return
。在我看来,当您真正意味着return
时,使用exit
只会使代码更加混乱。但是,如果您真的意味着exit
,那么务必使用它。
exit()
。从C语言的main函数中返回和退出提供了一些引用标准的答案。如果您的程序不作为独立进程运行,则第一个函数可能不叫做main
。如果是这样,那么您正在进行一些奇怪的操作,而不是在ISO C领域内。 - Peter Cordes至少有一个理由偏好使用 exit
:如果您的 atexit
处理程序引用了 main
中的自动存储期数据,或者您使用了 setvbuf
或 setbuf
来分配一个自动存储期缓冲区给 main
中的标准流之一,那么从 main
中返回将产生未定义行为,但调用 exit
是有效的。
另一个潜在的用途(通常仅用于玩具程序)是在具有递归调用 main
的情况下退出程序。
main()
函数并没有什么特别之处--它只是像其他任何函数一样。另一方面,由于它在标准中有特别的提及,标准必须非常小心地定义main()
和与其相关的事物。然而,最终标准并不要求编译器对main()
中的自动存储做任何特殊处理(也不能)。请务必仔细阅读您在评论中引用的段落下面的脚注#11。 - Greg A. Woods#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
顺便提一下:如果我记得没错,VMS对退出值的约定比奇偶更加细致。它实际上使用了类似低三位来编码严重级别的东西。通常情况下,奇数的严重级别表示成功或其他信息,偶数的表示错误。
main
函数返回的值与传递给 exit
函数的值不同对待,但标准明确指出:“如果 main
函数的返回类型与 int
兼容,则从初始调用 main
函数返回等效于使用 main
函数返回的值作为其参数调用 exit
函数”。这是 C11 的规定;C89/C90 几乎有相同的措辞。 - Keith Thompsonexit
才能将正确的返回值返回给主机环境。由于标准(即使当时)要求0与EXIT_SUCCESS
被视为相同,因此无法使用值为0来返回特定于平台的_失败_状态,这可能是该时代的一些编译器处理从主函数返回和exit()
的差异的原因。 - Adrian McCarthyreturn X;
语句与调用exit(X);
不完全相同,因为当main()返回时,main()的动态存储会消失,但如果调用exit()则不会。return
语句强烈提示读者执行将继续在调用函数中进行,虽然这种执行通常在技术上是正确的,如果您计算了调用main()函数的C启动例程,但这并不是您希望结束进程时的确切含义。return
语句结束main()中的程序是一个不好的习惯。exit()
,但如果在特定情况下throw
或abort()
替代方案无法工作,则可以使用它。但是特别要避免在main函数中使用exit()
,而是使用返回语句作为典型实践。 - Eljay我总是使用 return
,因为 main()
的标准原型表明它返回一个 int
。
也就是说,一些版本的标准对 main
进行了特殊处理,如果没有显式的 return
语句,则假定其返回 0。给定以下代码:
int foo() {}
int main(int argc, char *argv[]) {}
G++只对foo()
产生警告,而忽略了从main
函数中缺失的返回值:
% g++ -Wall -c foo.cc
foo.cc: In function ‘int foo()’:
foo.cc:1: warning: control reaches end of non-void function
return
来结束其执行。调用 exit()
也是一种有效的,有时是必要的方式来结束任何函数的执行。实际上,正如我和其他人在其他地方所描述的那样,即使从 main()
调用 exit()
,也传达了更清晰的退出整个进程的意图,保留自动存储直到进程退出,并且在未来重构代码时更易于维护。因此,在 C 中,当意图结束进程时,在 main()
中使用 return
可能是一种不良实践。 - Greg A. Woodsexit()
而不是在 main
中使用 return
的情况。另一方面,当包装一个不必要使用 exit()
的 main()
调用时,我曾经遇到过问题。这里绝大多数的答案和评论似乎都不同意你的观点,即在 main()
中使用 return
是“不好的做法”。 - Alnitak在C语言中,从main
函数返回与使用相同值调用exit
函数是完全相同的。
C标准的5.1.2.2.3节规定:
如果main函数的返回类型与int兼容,则从main函数的初始调用返回等同于使用main函数返回的值作为其参数调用exit函数; 11)到达终止main函数的}返回值为0。如果返回类型与int不兼容,则返回给主机环境的终止状态未指定。
C++的规则与其他答案中提到的有些不同。
在 main
函数中,exit(0)
和 return(0)
之间确实存在区别——尤其当你的 main
函数被多次调用时。
下面是一个示例程序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
if (argc == 0)
return(0);
printf("%d", main(argc - 1, argv));
}
以以下方式运行
./program 0 0 0 0
将会产生以下输出:
00000
然而这个:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
if (argc == 0)
exit(0);
printf("%d", main(argc - 1, argv));
}
无论参数如何,都不会打印任何内容。
如果您确定没有人会明确调用您的main
,从技术上讲,一般来说这并没有太大的区别,但为了保持更清晰的代码,exit
看起来会更好。 如果出于某种原因想要调用main
- 您应该根据自己的需求进行调整。
谈到C语言。
thread_local
对象的析构函数将被调用。其他本地对象的析构函数仍然不会被调用。http://ideone.com/Y6Dh3f - HolyBlackCat