我应该从main()返回EXIT_SUCCESS或0吗?

这是一个简单的问题,但是我一直看到相互冲突的答案: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中的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; 无论如何,所以你可能不需要明确使用0EXIT_SUCCESS 。 (但是至less在C中,我认为明确的return 0;是更好的风格。)

(有人问OpenVMS,我没有用很久,但是我记得奇数状态值通常表示成功,偶数表示失败,C实现映射01 ,所以return 0;表示终止成功。其他值不变,所以return 1;也表示成功终止, EXIT_FAILURE将有一个非零的偶数值。

不要紧。 两者都是一样的。

C ++标准行情:

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

根据定义,0是一个幻数。 EXIT_SUCCESS几乎普遍等于0,足够高兴。 那么为什么不只是返回/退出0?

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

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

tl; dr – 如果您的幻数有一个定义的常量,那么几乎没有理由不首先使用常量。 它更容易search,通常更清晰等等,而且不会花费任何东西。

这是一个永无止境的故事,反映了“互操作性和全面适应性”的界限(一个神话)。

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

但是程序员喜欢用“便携的方式”来编写代码,因此他们发明了自己的“操作系统”的概念,定义要返回的符号值。

现在,在一个多对多的情况下(许多语言用于将程序写入许多系统),“成功”的语言惯例和操作系统之间的对应关系(任何人都不能总是相同)由特定目标平台的图书馆的具体实施来处理。

但是,不幸的是,这些概念在C语言部署时(主要是为了编写UNIX内核)还不太清楚,还有一些书中的“返回0意味着成功”的书籍的Gigagrams,因为在操作系统上这是真实的那个时候有一个C编译器。

从那时起,关于如何处理这样的通信,没有明确的标准化。 C和C ++有自己的“返回值”的定义,但是没有人给出正确的操作系统翻译(或者更好的是没有编译器文档对此做任何说明)。 0对于UNIX – LINUX来说意味着成功,对于Windows来说也是独立的理由,对于Windows来说,这意味着成功,并覆盖现有“消费者计算机”的90%,在大多数情况下,它忽略了返回值(所以我们可以讨论几十年,不会有人会注意到!)

在这种情况下,在做出决定之前,请回答以下问题: – 我是否有兴趣向我的呼叫者传达一些关于我现有的信息? (如果我只是总是返回0 …没有任何背后的东西) – 我的来电者是否有约定这种沟通? (请注意,单个值不是一个约定:不允许任何信息表示)

如果这两个答案都是否定的,那么最好的解决scheme就是不写主返回语句。 (并且让编译器来决定,就目标而言)。

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

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

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

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

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

我个人build议“0”。

恕我直言…

如果你使用EXIT_SUCCESS,你的代码将更加便携。

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

是不是exit_success是一个macros定义为零。 我希望我能记得我读的地方。 这说EXIT_SUCCESS使它更有意义。 但是在下面的行中都被视为相同的头文件,EXIT_SUCCESS作为零。

有些编译器可能会产生这样的问题 – 在Mac C ++编译器中,EXIT_SUCCESS对我来说工作得很好,但是在Linux C ++编译器上我不得不添加cstdlib来知道EXIT_SUCCESS是什么。 除此之外,他们是一样的。

首先,我假设你知道main()应该总是返回int

其次,当我们从main函数返回一个值时,我们基本上是说“程序执行成功了!”

但是:大多数操作系统都会将return 0; 作为一个成功的运行,但有些会寻找return 1; 说“这个程序执行成功了!”

现在, EXIT_SUCCESS是一个C ++macros,它将确保它返回正确的值,总是说“这个程序已经成功执行了!

希望这可以帮助 :)

0 == False && False == EXIT_SUCCESS

在实践中,我不认为这有什么区别。 – 但是Main被定义为一个int,所以主返回一个int似乎是合乎逻辑的。 在某些情况下,您可能想要针对不同的错误返回不同的整数,而给出一个奇特的名字似乎很奇怪。

我不相信它哈哈 🙂

系统依赖的积分expression式

零是成功的最常见的操作系统,但在其他(Solaris类,我听说,几年前哈哈)是不是退出成功的代码,在Windows *和GNU / LINUX是好的,但更好地使用该macros恒定为零。

我认为如果你在最普通的操作系统的编程是好的,把零,你不会看到差异,但一个真正的… 真正的可移植程序应该有EXIT_SUCCESmacros而不是零。