为什么main的默认返回值是0而不是EXIT_SUCCESS?

时间:2009-07-27 14:05:52

标签: c++ return standards main

ISO 1998 c ++标准规定,在main中不明确使用return语句相当于使用return 0。 但是,如果实现具有不同的标准“无错误”代码,例如-1

,该怎么办?

为什么不使用可由EXIT_SUCCESS0替换的标准宏-1或任何其他值,具体取决于实施?

C ++似乎强制程序的语义,这不是一种语言的角色,它应该只描述程序的行为方式。此外,“错误”返回值的情况也不同:只有EXIT_FAILURE是标准的“错误”终止标志,没有明确的值,例如“1”。

这些选择的原因是什么?

9 个答案:

答案 0 :(得分:35)

main()返回零基本上与您所要求的相同。从main()返回零不必将零返回到主机环境。

来自C90 / C99 / C ++ 98标准文件:

  

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

答案 1 :(得分:18)

实际上,return 0不一定会返回0!我在这里引用C标准,因为这是我最了解的。

关于return中的main()

  

5.1.2.2.3程序终止

     

如果main函数的返回类型是与int兼容的类型,则从初始调用到main函数的返回等同于使用值调用exit函数由main函数返回作为其参数;

关于exit()

  

7.20.4.3退出功能
    概要

#include <stdlib.h>
void exit(int status);
     

[...]
  最后,控制权返回给主机环境。如果status的值为零或   EXIT_SUCCESS,状态成功终止的实现定义形式   返回。

答案 2 :(得分:5)

标准只是确定未明确设置时必须是什么值。开发人员可以显式设置返回值,也可以为默认值设置适当的语义。我不认为该语言试图强迫开发人员使用任何语义。

答案 3 :(得分:4)

0是所有POSIX系统上的标准(成功)退出代码,以及我所知道的所有系统!我认为这种方式一直都是这样的(或者至少从Unix开始......)因此我会这样说。

你知道什么系统不同?

答案 4 :(得分:3)

0作为成功的返回码,而正整数作为错误是C和Unix的标准。选择这个方案是因为通常人们不关心为什么一个程序成功,只是它确实如此。另一方面,有很多方法可以使程序失败并出现错误,并且通常会对此信息感兴趣。因此,使用标量值表示成功以及使用一系列错误值是有意义的。使用正整数是一种节省内存的C约定,因为它们允许将错误代码定义为unsigned int。

答案 5 :(得分:2)

OS / 360和后继者使用数字退出代码,0通常成功,4用于警告(例如生成警告消息的编译器),8表示错误,以及12表示特别糟糕的错误 (例如无法打开标准输出单元SYSPRINT。)

答案 6 :(得分:1)

计算机语言标准说明用该语言编写的程序必须做什么,以及将会发生什么。在这种情况下,C和C ++标准表示返回0表示成功,等等。

语言实现允许程序在特定实现上运行。实现者的工作是弄清楚如何根据标准使I / O工作,或者为操作系统提供正确的结果代码。

程序的功能以及操作系统看到的内容不一定是一回事。所有必要的是程序按照标准在给定的OS上运行。

答案 7 :(得分:1)

通过浏览cstdlib我最终得到两行:

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

因此,EXIT_SUCCESS等于0,而EXIT_FAILURE等于1,这意味着无关紧要。

检查Linux(OpenSuse)并最终得到同样的东西。

答案 8 :(得分:0)

如果您还在考虑为什么成功的错误代码是0而不是任何其他值,我会补充说它可能在历史上出于性能原因,因为与0的比较速度要快得多(我认为在现代架构中)可能与任何数字相同)并且通常你不检查特定的错误代码,只要它是成功或任何错误(因此使用最快的比较是有意义的。)