在`main`可选的结尾处使`return 0`的理由是什么?

Edw*_*ard 32 c c++ language-lawyer

从C99标准开始,编译器需要生成等效的a return 0或者return EXIT_SUCCESS如果在结尾处没有提供返回main.在同一时间,对C++语言标准也进行了相应且相同的更改.我对两者的原因感兴趣,并且我猜测它们不太可能是完全独立且无关的变化.

我的问题是:

这种变化的记录理由是什么?

一个理想的答案将引用C和C++的权威来源,这就是我用两种语言标记问题的原因.

请注意,与问题不同,在ISO C++中,从main返回0的原因是什么?,我不是在询问是否写return 0我的程序的建议 - 我问的是为什么语言标准本身已经改变了.


为了帮助理解问题的目的,这里有更多的背景:

  1. 了解更改原因有助于决定如何使用它.
  2. 理由通常包含在标准本身中.例如,C90标准包括许多解释性脚注,例如脚注36,其开头是"此列表的意图......"

在我问到这个问题之前,我已经研究了自己寻找答案的标准,但没有找到答案.我被要求帮助为一组程序员编写两种语言的编码标准,我想确保我理解为什么这个功能存在,以便我可以准确地向其他人解释它的用途.

Sha*_*our 25

新C标准部分5.1.2.2.3程序终止作者Derek Jones对C99标准中的这一行的评论:

到达终止main函数的}返回值0

是:

标准最终不得不屈服于现有的做法.

这表明理由是解决关于显式返回值的糟糕编程实践main.在此之前,返回的状态未定义.

他指出,即使在C90中,许多实现已经实现了这一点,因此这一变化已经反映了常见的实现也可能有所帮助.

  • C89已经要求"如果main函数执行一个不指定值的返回,则返回到主机环境的终止状态是未定义的." 所以它(至少)不是未定义的行为,如果主机环境不使用退出值,则C89和C99之间没有区别. (2认同)

Ben*_*igt 10

C99官方理由文件几乎没有解决这个问题.它似乎exit(0)成为了main之外的控制流的默认值,因为它exit(0)被赋予了有意义的可移植语义.

以下是两个相关部分:

5.1.2.2.1程序启动

的参数的行为main,并相互作用的exit,mainatexit(见§7.20.4.2)已编纂遏制的代表性一些不需要的各种argv字符串,通过返回值的含义main.

主要的规范argcargv作为主要参数承认广泛的先前实践.

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被指定为一种在不触发另一个信号的情况下离开信号处理程序的方法,但这实际上并不是_exitPOSIX环境中的行为方式.委员会不希望给程序员这种虚假的希望.(但参见C99的§7.20.4.4.)

  • *"似乎`exit(0)`成为main结束时控制流的默认值,因为`exit(0)`被赋予了有意义的可移植语义."* - 这并不完全遵循.C89/C90指定`exit(0)`(或`return 0;`from main`)表示成功终止,但是从`main`的结尾掉落并不等同于`return 0;`直到C99. (7认同)
  • 我很感激努力.它似乎解释了"返回0"和"返回EXIT_SUCCESS"等价的动机,但没有将返回的进一步突变解释为"返回0".如果你在那里看到它,你能提供一些解释来解释你在哪里看到它吗? (2认同)