Edw*_*ard 32 c c++ language-lawyer
从C99标准开始,编译器需要生成等效的a return 0
或者return EXIT_SUCCESS
如果在结尾处没有提供返回main
.在同一时间,对C++语言标准也进行了相应且相同的更改.我对两者的原因感兴趣,并且我猜测它们不太可能是完全独立且无关的变化.
我的问题是:
这种变化的记录理由是什么?
一个理想的答案将引用C和C++的权威来源,这就是我用两种语言标记问题的原因.
请注意,与问题不同,在ISO C++中,从main返回0的原因是什么?,我不是在询问是否写return 0
我的程序的建议 - 我问的是为什么语言标准本身已经改变了.
为了帮助理解问题的目的,这里有更多的背景:
在我问到这个问题之前,我已经研究了自己寻找答案的标准,但没有找到答案.我被要求帮助为一组程序员编写两种语言的编码标准,我想确保我理解为什么这个功能存在,以便我可以准确地向其他人解释它的用途.
Sha*_*our 25
在新C标准部分5.1.2.2.3程序终止作者Derek Jones对C99标准中的这一行的评论:
到达终止main函数的}返回值0
是:
标准最终不得不屈服于现有的做法.
这表明理由是解决关于显式返回值的糟糕编程实践main
.在此之前,返回的状态未定义.
他指出,即使在C90中,许多实现已经实现了这一点,因此这一变化已经反映了常见的实现也可能有所帮助.
Ben*_*igt 10
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
是唯一可以使用零或两个参数进行声明的函数.(其他函数参数的数量必须在调用和定义之间完全匹配.)这种特殊情况简单地认识到main
在程序不访问程序参数字符串时不使用参数的普遍做法.虽然许多实现支持两个以上的参数main
,但标准既没有祝福也没有禁止这种做法; 用三个参数定义main的程序并不严格符合(参见§J.5.1.).命令行I/O重定向不是标准规定的,因为这被认为是底层操作系统而不是C语言的一个特性.
和
7.20.4.3退出功能
参数to
exit
是返回到调用环境的状态指示.在UNIX操作系统中,值为零是程序的成功返回代码.由于C的使用已经扩展到UNIX之外,exit(0)
因此即使在具有不同返回码系统的操作系统上,也经常被保留为表示成功终止的习惯用语.因此,该用法被认为是标准的.从来没有一种表示非成功终止的可移植方式,因为参数exit
是实现定义的.在EXIT_FAILURE
宏观加入C89提供这样的能力.EXIT_SUCCESS
也加入了.除了由程序员显式编码的
exit
调用之外,在返回时调用main
.因此,至少在这种情况下,身体exit
不能假设存在具有自动存储持续时间的任何物体,除了那些声明的物体exit
.委员会考虑了添加
_exit
,但基于与其所基于的POSIX规范不兼容的问题而拒绝了它.例如,表达的一个问题是_exit
被指定为一种在不触发另一个信号的情况下离开信号处理程序的方法,但这实际上并不是_exit
POSIX环境中的行为方式.委员会不希望给程序员这种虚假的希望.(但参见C99的§7.20.4.4.)