这是一个简单的问题,但我一直看到相互矛盾的答案:C++程序的主例程应该返回0
还是EXIT_SUCCESS
?
#include <cstdlib>
int main(){return EXIT_SUCCESS;}
或
int main(){return 0;}
它们是完全一样的东西吗?EXIT_SUCCESS
是否应仅与exit()
一起使用?
我认为EXIT_SUCCESS
是一个更好的选择,因为其他软件可能希望将零视为失败,但我也听说,如果返回0
,编译器无论如何都可以将其更改为不同的值。
EXIT_FAILURE
,无论是在main
中的返回语句中,还是作为exit()
的参数,都是指示C或C++程序失败的唯一可移植方法。exit(1)
实际上可以在VMS上发出成功终止的信号。
如果程序失败时要使用EXIT_FAILURE
,那么为了对称起见,在成功时也可以使用EXIT_SUCCESS
。
另一方面,如果程序从未发出故障信号,则可以使用0
或EXIT_SUCCESS
。两者都有标准保证,标志着成功完成。(EXIT_SUCCESS
几乎不可能有0以外的值,但在我听说过的每个实现中,它都等于0。)
使用0
的一个小优点是,您不需要C中的#include <stdlib.h>
或C++中的#include <cstdlib>
(如果您使用的是return
语句而不是调用exit()
),但对于任何重要大小的程序,您都将直接或间接地包含stdlib。
就这一点而言,在从1999标准开始的C中,以及在C++的所有版本中,到达main()
的末尾无论如何都会执行隐含的return 0;
,因此您可能不需要显式使用0
或EXIT_SUCCESS
。(但至少在C中,我认为显式return 0;
是更好的风格。)
(有人问过OpenVMS。我已经很久没有使用它了,但据我回忆,奇数状态值通常表示成功,偶数值表示失败。C实现将0
映射到1
,因此return 0;
表示成功终止。其他值不变,所以return 1;
也表示成功终止。EXIT_FAILURE
将具有非零偶数值。)
这无关紧要。两者都一样。
C++标准报价:
若状态的值为零或EXIT_SUCCESS,则返回状态成功终止的实现定义形式。
0根据定义是一个幻数。EXIT_SUCCESS几乎普遍等于0,这很令人高兴。那么为什么不直接返回/退出0呢?
退出(exit_SUCCESS);意思非常清楚。
退出(0);另一方面,这在某些方面是违反直觉的。不熟悉shell行为的人可能会认为0==false==bad,就像C中0的其他用法一样。但不是——在这个特殊情况下,0==success==good。对于大多数有经验的开发人员来说,这不会是一个问题。但为什么毫无理由地绊倒这个新人呢?
tl;dr-如果你的幻数有一个定义的常数,那么从一开始就没有理由不使用这个常数。它更易于搜索,通常更清晰,等等,而且不需要花费任何费用。
这是一个永无止境的故事,反映了"全面的互操作性和可移植性"的局限性(一个神话)。
程序应该返回什么来表示"成功",应该由谁接收值(操作系统或调用程序的进程)来定义,而不是由语言规范来定义。
但程序员喜欢以"可移植的方式"编写代码,因此他们发明了自己的"操作系统"概念模型,定义要返回的符号值。
现在,在多对多场景中(许多语言用于向多个系统编写程序),"成功"的语言约定和操作系统约定(没有人可以认为总是相同的)之间的对应关系应该由特定目标平台的库的特定实现来处理。
但是,不幸的是,在部署C语言时(主要是为了编写UNIX内核),这些概念并不那么清楚,在很多书中,"返回0意味着成功",因为当时有C编译器的操作系统就是这样。
从那时起,对于如何处理这样的信件,就再也没有明确的标准化了。C和C++有自己的"返回值"定义,但没有人提供正确的操作系统翻译(或者更好:没有编译器文档对此做任何说明)。0意味着成功,如果它适用于UNIX-LINUX,出于独立的原因,也适用于Windows,并且它覆盖了90%的现有"消费者计算机",在大多数情况下,它忽略了返回值(所以我们可以讨论几十年,但没有人会注意到!)
在这种情况下,在做出决定之前,请提出以下问题:-我是否有兴趣与来电者交流我现有的信息?(如果我总是返回0……这一切背后都没有线索)-我的来电者是否对此通信有约定?(注意,单个值不是约定:这不允许任何信息表示)
如果这两个答案都是否定的,那么最好的解决方案可能是根本不编写主返回语句。(并让编译器决定,就目标而言是在工作)。
如果没有约定,0=成功满足大多数情况(如果使用符号引入约定,则使用符号可能会有问题)。
如果已有约定,请确保使用与其一致的符号常量(并确保平台之间的约定一致性,而不是价值一致性)。
一旦您开始编写可以返回无数退出状态的代码,就可以开始#define
'处理所有退出状态。在这种情况下,EXIT_SUCCESS
在不是"幻数"的情况下是有意义的。这使您的代码更加可读,因为每隔一个退出代码都是EXIT_SOMETHING
。如果你只是简单地编写一个程序,当它完成时会返回,那么return 0
是有效的,甚至可能更干净,因为它表明没有复杂的返回代码结构。
您从程序返回的只是一种约定。
不,我想不出在任何情况下"EXIT_SUCCESS"都不会是"0"。
就我个人而言,我推荐"0"。
IMHO。。。
tl;医生:你就是不能退货
不从main()
函数显式返回任何内容是可以的(Bjarne Stroustrup这么说…)。如果您的操作系统期望返回值,编译器会很小心。
这并不是为了削弱@KeithThompson或@EmilioGaravaglia在回答中关于不同可能返回值的情况的讨论,以及了解如何解释程序的返回值等。
如果使用EXIT_SUCCESS,您的代码将更具可移植性。
http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/
有些编译器可能会对此产生问题-在Mac C++编译器上,EXIT_SUCCESS对我来说很好,但在Linux C++编译器上我必须添加cstdlib才能知道EXIT_SUSUCCESS是什么。除此之外,它们是一体的。