【发布时间】:2013-11-23 15:45:54
【问题描述】:
假设我们有程序:
int main(int argc, char** argv){
if(argc < 3){
printf("usage details\n");
return EXIT_FAILURE;
}
dostuff();
return EXIT_SUCCESS;
}
我也见过这个:
int main(int argc, char** argv){
if(argc < 3){
printf("usage details\n");
exit(EXIT_FAILURE);
}
dostuff();
exit(EXIT_SUCCESS);
}
根据ISO/IEC 9899:1989 (C90):
标准定义了 3 个严格符合的返回值(即不依赖于实现定义的行为):0 和 EXIT_SUCCESS 表示成功终止,EXIT_FAILURE 表示不成功终止。任何其他值都是非标准的和实现定义的。 main 必须在末尾有一个明确的 return 语句以避免未定义的行为。
另外,根据 ISO/IEC 9899:2011:
5.1.2.2.3 程序终止
如果主函数的返回类型是与int兼容的类型,则从初始调用主函数返回相当于以主函数返回的值作为参数调用exit函数;到达终止main函数的}返回值0。如果返回类型与int不兼容,则返回宿主环境的终止状态未指定。
表示从main返回相当于调用exit,返回值相同。
话虽如此,问题是: 重要的是,您是从 main 返回并让它为您调用 exit,还是从 main 退出
【问题讨论】:
-
是等价的。正如标准所说。即可以互换。
-
视情况而定。您是否打算在自己的代码中自己调用 main()(可能是递归的)?如果是这样,exit() 是一个限制性选择。
-
@JohnDeters:标准还禁止调用
main()。 -
@duskwuff,这是 C++ 标准。 AFAIK,它在 C 中是合法的。但这仍然不是一个特别好的主意。
-
是的,调用 main 在 C 中是合法的,但似乎不是一个好主意(尤其是如果我们定义 at_exit)
标签: c