这是一个简单的问题,但我一直看到矛盾的答案:一个C++程序的主程序应该返回0还是EXIT_SUCCESS

#include <cstdlib>
int main(){return EXIT_SUCCESS;}

int main(){return 0;}

它们是完全一样的吗?EXIT_SUCCESS应该只与exit()一起使用吗?

我认为EXIT_SUCCESS是一个更好的 Select ,因为其他软件可能希望将零视为失败,但我还听说,如果返回0,编译器无论如何都可以将其更改为不同的值.

推荐答案

EXIT_FAILURE,或者在main的返回语句中,或者作为参数到exit(),是唯一指示C或C++程序中的故障的可移植方法.例如,exit(1)实际上可以在虚拟机上发出成功终止的信号.

如果你打算在程序失败时使用EXIT_FAILURE,那么为了对称起见,在程序成功时也可以使用EXIT_SUCCESS.

另一方面,如果程序从未发出失败信号,则可以使用0EXIT_SUCCESS.这两个都是由标准保证的,以表示成功完成.(EXIT_SUCCESS几乎不可能有一个非0的值,但在我听说过的每个实现中,它都等于0.)

使用0的优点是,C中不需要#include <stdlib.h>,或者C++中有#include <cstdlib>个(如果使用return语句而不是调用exit()),但是对于任何显著大小的程序,不管怎样,您将直接或间接地包括STDLIB.

在这方面,在C中从1999标准开始,在C++的所有版本中,达到main()结尾都会有一个隐式return 0;,所以您可能不需要明确地使用0EXIT_SUCCESS.(但至少在C,我认为一个明确的return 0;是更好的风格.)

(有人问起OpenVMS.我已经很久没有使用它了,但我记得奇数状态值通常表示成功,偶数值表示失败.C实现将0映射到1,因此return 0;表示成功终止.其他值传递不变,因此return 1;也表示成功终止.EXIT_FAILURE将具有非零偶数值.)

C++相关问答推荐

C中char数组指针的问题

插入元素后,Sizeof操作符无法正常工作

由于未签名int导致的运行时错误"

根据工具链文件中的定义替换单个函数定义

理解没有返回语句的递归C函数的行为

为什么复合文字(C99)的返回会生成更多的汇编代码?

为什么C语言允许你使用var =(struct NAME){

将数据移动到寄存器时出现分段故障

预先分配虚拟地址空间的区域

为什么我的Hello World EFI程序构建不正确?

如何编写一个for循环来计算C中各项的总和?

C11/C17标准允许编译器清除复合文字内存吗?

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

Makefile无法将代码刷新到ATmega328p

生成的头文件不包括用户定义的文件

如果类型是新的,offsetof是否与typeof一起工作?

C中2个数字的加法 - 简单的人类方法

如何修复数组数据与列标题未对齐的问题?

将数组返回到链表

malloc:损坏的顶部大小无法找出问题