ISO 1998 C++标准规定,在main函数中不显式使用return语句等同于使用return 0
。但如果实现有不同的"无错误"代码标准,例如-1
,该怎么办?
为什么不使用标准宏EXIT_SUCCESS
,它将根据实现替换为0
、-1
或任何其他值?
C++似乎强制规定程序的语义,这不是语言的作用,语言应该只描述程序的行为。此外,在"错误"返回值方面情况不同:只有EXIT_FAILURE
是标准的"错误"终止标志,没有明确的值,比如"1"。
这些选择的原因是什么?
ISO 1998 C++标准规定,在main函数中不显式使用return语句等同于使用return 0
。但如果实现有不同的"无错误"代码标准,例如-1
,该怎么办?
为什么不使用标准宏EXIT_SUCCESS
,它将根据实现替换为0
、-1
或任何其他值?
C++似乎强制规定程序的语义,这不是语言的作用,语言应该只描述程序的行为。此外,在"错误"返回值方面情况不同:只有EXIT_FAILURE
是标准的"错误"终止标志,没有明确的值,比如"1"。
这些选择的原因是什么?
从main()
返回零基本上与您要求的内容相同。 从main()
返回零不一定要向主机环境返回零。
来自C90 / C99 / C ++ 98标准文档:
如果status的值为零或
EXIT_SUCCESS
,则会返回实现定义的成功终止状态的形式。
实际上,return 0
并不一定会返回0!我引用C标准来解释这个问题,因为这是我最熟悉的。
关于 main()
中的 return
:
5.1.2.2.3 程序终止
如果
main
函数的返回类型与int
兼容,那么从main
函数的初始调用返回等同于使用main
函数返回的值作为参数调用exit
函数;
关于 exit()
:
7.20.4.3 exit函数
梗概
#include <stdlib.h> void exit(int status);
[...]
最后,控制权返回给宿主环境。如果status
的值为零或者EXIT_SUCCESS
,则会返回一个实现定义的形式表示成功终止的状态。
标准只是确定了当没有明确设置时必须是什么值。开发人员可以显式地设置返回值,也可以假定默认值的适当语义。我认为该语言并不试图强加任何语义给开发人员。
在所有的POSIX系统以及我所知道的所有系统中,0都是标准(成功)退出代码!我认为自Unix诞生以来就一直是这样。因此,出于这个原因,我会这么说。
你知道有哪些不同的系统吗?
OS/360及其后续版本使用数字退出代码,其中0
通常表示成功,4
表示警告(例如生成警告消息的编译器),8
表示错误,12
表示特别严重的错误(例如无法打开SYSPRINT,即标准输出单元)。
在C语言和Unix中,0是成功的返回代码,正整数则表示错误。这种方案的选择是因为通常人们并不关心程序成功的原因,只关心它是否成功执行。另一方面,程序失败的方式有很多种,人们经常对此感兴趣。因此,使用一个标量值来表示成功,使用一系列值来表示错误是有意义的。使用正整数是C语言中省内存的约定,因为它们允许将错误代码定义为无符号整型。
cstdlib
,我得到了两行代码:#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
EXIT_SUCCESS
等于0
,EXIT_FAILURE
等于1
,这意味着它并不重要。在Linux(OpenSuse)上检查结果相同。
EXIT_SUCCESS
是等价的返回值,因此默认返回哪一个标准要求的并不重要。 - Rob Kennedy