在`main`选项末尾做'return 0`的原因是什么?

从C99标准开始,编译器需要生成等价的return 0return EXIT_SUCCESS如果在main的末尾没有提供返回值。 大约在同一时间,C ++语言标准也出现了相应的变化。 我对两者的理由感兴趣,我猜想这不可能是完全独立和无关的变化。

我的问题是:

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

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

请注意,与问题不同的是,在ISO C ++中主要返回0的原因是什么?我没有要求关于是否在程序中写入return 0建议 - 我在问为什么语言标准本身发生了变化。


为了帮助理解问题的目的,以下是更多的上下文:

  • 了解改变的原因有助于决定如何使用它。
  • 理由通常包含在标准本身内。 例如,C90标准包含许多解释性脚注,例如脚注36,其开头是“该列表的意图......”
  • 在我问这里之前,我已经研究过寻找答案的标准,但没有找到答案。 我被要求帮助编写一组程序员的两种语言的编码标准,并且我想确保我明白为什么这个特性存在,以便我可以准确地向其他人解释它的用法。


    在新C标准章节中5.1.2.2.3程序终止作者Derek Jones对C99标准的评论:

    到达}终止主函数返回值为0

    是:

    标准最终不得不鞠躬现有的做法。

    这表明其理由是为了解决不良的编程实践方面的问题,即明确返回main的值。 在此之前,返回的状态是未定义的。

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


    C99的官方基本原理文件几乎没有解决这个问题。 看起来exit(0)成为控制流在main结尾的默认值,因为exit(0)被赋予了有意义的可移植语义。

    以下是两个相关部分:

    5.1.2.2.1程序启动

    main参数以及exitmainatexit (参见§7.20.4.2)的相互作用的行为已被编纂为抑制argv字符串表示形式中某些不需要的变体,以及由main返回的值的含义

    argcargv作为主要参数的规范认可了大量的先前实践。

    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节。)

    链接地址: http://www.djcxy.com/p/28743.html

    上一篇: 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++?