我应该从main()返回EXIT_SUCCESS还是0?

时间:2012-01-15 06:09:05

标签: c++ c return-value main

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

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

int main(){return 0;}

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

我认为EXIT_SUCCESS会是一个更好的选择,因为其他软件可能想要将零视为失败,但我也听说如果你返回0,编译器就能将它改为不同的无论如何都要有价值。

9 个答案:

答案 0 :(得分:130)

EXIT_FAILURE,在main的return语句中或作为exit()的参数,是指示C或C ++程序失败的唯一可移植方式。例如,exit(1)实际上可以表示在VMS上成功终止。

如果您在程序失败时使用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;,所以你可能不需要使用{明确{1}}或0。 (但至少在C中,我认为明确的EXIT_SUCCESS是更好的风格。)

(有人问过OpenVMS。我很久没有使用它了,但是我记得奇怪的状态值通常表示成功,而偶数值表示失败.C实现将return 0;映射到{{1} },以便0表示成功终止。其他值未更改,因此1也表示成功终止。return 0;将具有非零偶数值。)

答案 1 :(得分:24)

没关系。两者都是一样的。

C ++标准语录:

  

如果status的值为零或EXIT_SUCCESS,则返回状态成功终止的实现定义形式。

答案 2 :(得分:9)

根据定义,

0是幻数。 EXIT_SUCCESS几乎普遍等于0,非常高兴。那么为什么不返回/退出0呢?

出口(EXIT_SUCCESS);意义非常明确。

出口(0);另一方面,在某些方面是违反直觉的。不熟悉shell行为的人可能会认为0 == false ==坏,就像C中每个其他0的使用情况一样。但是没有 - 在这一个特例中,0 = =成功==好。对于大多数经验丰富的开发者来说,不会成为问题。但是,为什么绝对没有理由绊倒新人?

tl; dr - 如果您的幻数有一个已定义的常量,那么几乎没有理由不首先使用该常量。它更易于搜索,通常更清晰等等,而且不会让您付出任何代价。

答案 3 :(得分:9)

这是一个永无止境的故事,反映了“所有人的互操作性和可融合性”的限制(神话)。

程序应该返回什么表示“成功”应该由谁接收值(操作系统或调用程序的进程)而不是语言规范来定义。

但是程序员喜欢以“可移植的方式”编写代码,因此他们发明了自己的“操作系统”概念模型来定义符号值。

现在,在多对多场景中(许多语言用于向许多系统编写程序),“成功”语言约定与操作系统之间的对应关系(没有人可以授予总是应该由特定目标平台的库的特定实现来处理。

但是 - 不幸的是 - 这些概念在部署C语言时并不是那么清楚(主要是编写UNIX内核),以及通过说“返回0意味着成功”编写的Gigagrams书籍,因为这是真的当时的操作系统有一个C编译器。

从那以后,没有明确标准化如何处理这种通信。 C和C ++有自己的“返回值”定义,但没有人授予适当的操作系统转换(或更好:没有编译器文档说明任何内容)。 0表示成功,如果UNIX为真 - LINUX和 - 由于独立原因 - 对于Windows,这涵盖了90%的现有“消费者计算机”,在大多数情况下 - 忽略了返回值(所以我们可以几十年来讨论,没有人会注意到!)

在此方案中,在做出决定之前,请询问以下问题:   - 我是否有兴趣向我的来电者传达有关我现有的信息? (如果我总是返回0 ......那么所有事情背后都没有任何线索)   - 我的来电者是否有关于此通信的约定? (请注意,单个值不是约定:不允许任何信息表示)

如果这两个答案都不是,那么好的解决办法就是不要写主要的return语句。 (并让编译器决定,就目标而言)。

如果没有约定0 =成功满足大多数情况(如果引入约定,使用符号可能会有问题。)

如果有约定,请确保使用与它们一致的符号常量(并确保平台之间的约定一致性,而不是值一致性)。

答案 4 :(得分:4)

一旦开始编写可以返回大量退出状态的代码,就可以开始#define所有退出状态。在这种情况下,EXIT_SUCCESS在不是“magic number”的背景下有意义。这使您的代码更具可读性,因为每个其他退出代码都是EXIT_SOMETHING。如果你只是编写一个程序,它会在完成时返回,return 0是有效的,甚至可能更干净,因为它表明没有复杂的返回代码结构。

答案 5 :(得分:0)

你从程序中返回的只是一个约定。

不,我想不出“EXIT_SUCCESS”不会为“0”的任何情况。

就个人而言,我建议“0”。

... IMHO

答案 6 :(得分:-3)

如果您使用EXIT_SUCCESS,您的代码将更具可移植性。

http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/

答案 7 :(得分:-4)

有些编译器可能会产生问题 - 在Mac C ++编译器上,EXIT_SUCCESS对我来说很好,但在Linux C ++编译器上我必须添加cstdlib才能知道EXIT_SUCCESS是什么。除此之外,它们是同一个。

答案 8 :(得分:-5)

0 ==假和&amp;&amp;错误== EXIT_SUCCESS

在实践中,我认为它没有多大区别。 - 但是Main被定义为一个int,所以main返回一个int似乎是合乎逻辑的。在某些情况下,您可能希望为不同的错误返回不同的整数,给一个奇特的名称看起来很奇怪。