在`main`选项末尾做'return 0`的原因是什么?
从C99标准开始,编译器需要生成等价的return 0
或return EXIT_SUCCESS
如果在main
的末尾没有提供返回值。 大约在同一时间,C ++语言标准也出现了相应的变化。 我对两者的理由感兴趣,我猜想这不可能是完全独立和无关的变化。
我的问题是:
记录这个变化的理由是什么?
一个理想的答案会引用C和C ++的权威来源,这就是为什么我用两种语言标记问题的原因。
请注意,与问题不同的是,在ISO C ++中主要返回0的原因是什么?我没有要求关于是否在程序中写入return 0
建议 - 我在问为什么语言标准本身发生了变化。
为了帮助理解问题的目的,以下是更多的上下文:
在我问这里之前,我已经研究过寻找答案的标准,但没有找到答案。 我被要求帮助编写一组程序员的两种语言的编码标准,并且我想确保我明白为什么这个特性存在,以便我可以准确地向其他人解释它的用法。
在新C标准章节中5.1.2.2.3程序终止作者Derek Jones对C99标准的评论:
到达}终止主函数返回值为0
是:
标准最终不得不鞠躬现有的做法。
这表明其理由是为了解决不良的编程实践方面的问题,即明确返回main
的值。 在此之前,返回的状态是未定义的。
他指出,即使在C90中,许多实现已经实现了这一点,所以这一变化已经反映了常见的实现也可能有所帮助。
C99的官方基本原理文件几乎没有解决这个问题。 看起来exit(0)
成为控制流在main结尾的默认值,因为exit(0)
被赋予了有意义的可移植语义。
以下是两个相关部分:
5.1.2.2.1程序启动
main
参数以及exit
, main
和atexit
(参见§7.20.4.2)的相互作用的行为已被编纂为抑制argv
字符串表示形式中某些不需要的变体,以及由main
返回的值的含义 。
argc
和argv
作为主要参数的规范认可了大量的先前实践。
argv[argc]
必须是一个空指针,以便根据惯例为列表的末尾提供冗余检查。
main
是唯一可以用0或2个参数声明的函数。 (其他函数参数的数量必须与调用和定义完全匹配)。这种特殊情况只是简单地认识到当程序不访问程序参数字符串时,将参数从main
参数中删除的普遍做法。 虽然许多实现支持两个以上的main
参数,但这样的实践既不被标准祝福也不被禁止; 一个用三个参数定义主体的程序并不严格符合(见§5.5.1)。
命令行I / O重定向不是由标准强制的,因为它被认为是底层操作系统的一个特征,而不是C语言。
和
7.20.4.3退出功能
exit
参数是返回到调用环境的状态指示。 在UNIX操作系统中,值为零是来自程序的成功返回码。 由于C的使用已经扩展到了UNIX之外 ,即使在具有不同系统返回码的操作系统上, exit(0)
通常也被保留为成功终止的习惯用法 。 这种用法因此被认为是标准。 由于exit
的参数是实现定义的,因此从来没有一种可移植的方式来指示不成功的终止。 EXIT_FAILURE
宏被添加到C89以提供这样的功能。 EXIT_SUCCESS
也被添加了。
除了由程序员明确编码的调用外,在从main
返回时调用exit
。 因此,至少在这种情况下, exit
主体不能假定存在具有自动存储持续时间的任何对象,除了在exit
声明的对象。
委员会考虑增加_exit
,但基于与它所基于的POSIX规范不兼容的担忧而拒绝。 例如,表达的一个担忧是_exit
被指定为脱离信号处理程序而不触发另一个信号的方式,但实际上这不是_exit
在POSIX环境中的行为方式。 委员会不希望给程序员这种虚假的希望。 (但请参阅C99的第7.20.4.4节。)
上一篇: What was the rationale for making `return 0` at the end of `main` optional?
下一篇: What the reasons for/against returning 0 from main in ISO C++?