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

时间:2015-07-13 21:55:39

标签: c++ c language-lawyer

从C99标准开始,如果在{{1}的末尾没有提供返回,则编译器需要生成等效的from Tkinter import * import tkSimpleDialog import tkMessageBox root = Tk() w = Label(root, text="") w.pack() User_info = tkSimpleDialog.askstring("User Information", "What is your name?") def List(List_name): List_name = [] List_name.append(User_info) return List_name print List return 0 }。在同一时间,对C ++语言标准也进行了相应且相同的更改。我对两者的原因感兴趣,并且我猜测它们不太可能是完全独立且无关的变化。

我的问题是:

此更改的记录理由是什么?

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

请注意,与问题What the reasons for/against returning 0 from main in ISO C++?不同,我不会就是否在我的程序中编写return EXIT_SUCCESS提出建议 - 我会问为什么语言标准本身已被更改

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

  1. 了解更改原因有助于决定如何使用它。
  2. 基本原则通常包含在标准本身中。例如,C90标准包括许多解释性脚注,例如脚注36开始,"此列表的意图......"
  3. 在我问到这个问题之前,我已经研究过自己寻找答案的标准,但没有找到答案。我被要求帮助为一组程序员编写两种语言的编码标准,我想确保我理解为什么这个功能存在,以便我可以准确地向其他人解释它的使用。

2 个答案:

答案 0 :(得分:25)

The New C Standard部分5.1.2.2.3 Program termination中,作者Derek Jones对C99标准中的这一行进行了评论:

  

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

是:

  

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

这表明理由是解决从main明确返回值的糟糕编程实践。在此之前,返回的状态未定义。

他表示许多实现已经在C90中实现了这一点,因此这一变化已经反映了常见的实现也可能有所帮助。

答案 1 :(得分:10)

official rationale document for C99几乎没有解决这个问题。似乎exit(0)成为main结束时控制流的默认值,因为exit(0)被赋予了有意义的可移植语义。

以下是两个相关部分:

  

5.1.2.2.1程序启动

     

main的参数行为以及exitmainatexit的互动行为(参见§7.20.4.2)已被编纂遏制argv字符串表示中的一些不必要的变化,以及main 返回的值的含义。

     

作为主要论据的argcargv的规范承认了广泛的先前实践。

     

argv[argc]必须是一个空指针,以便在列表末尾提供冗余检查,同样基于通常的做法。

     

main是唯一可以使用零或两个参数进行声明的函数。 (其他函数的参数的数量必须在调用和定义之间完全匹配。)这种特殊情况简单地认识到当程序不访问程序参数字符串时,将参数留给main的普遍做法。虽然许多实现支持main的两个以上的参数,但这种做法既不受祝福也不被标准禁止;一个用三个参数定义main的程序并不严格   符合(见§J.5.1。)。

     

标准不强制命令行I / O重定向,因为这被认为是底层操作系统的一个特性,而不是C语言。

  

7.20.4.3退出功能

     

exit的参数是返回到调用环境的状态指示。在UNIX操作系统中,值为零是程序的成功返回代码。 由于C的使用已经扩展到UNIX以外,exit(0)通常被保留为表示成功终止的习惯用法,即使在具有不同返回码系统的操作系统上也是如此。因此,这种用法   被认可为标准。从来没有一种表示不成功终止的可移植方式,因为exit的参数是实现定义的。 {C}已添加EXIT_FAILURE宏以提供此类功能。还添加了EXIT_SUCCESS

     

除了程序员明确编码的调用之外,从exit返回时调用main。因此,至少在这种情况下,exit的主体不能假设存在具有自动存储持续时间的任何对象,除了在exit中声明的那些对象。

     

委员会考虑增加_exit,但基于与其所依据的POSIX规范不兼容的担忧而拒绝了它。例如,表达的一个问题是_exit被指定为一种在不触发另一个信号的情况下退出信号处理程序的方法,但这实际上并不是_exit在POSIX环境中的行为方式。委员会不希望给程序员这种虚假的希望。 (但见§7.20.4.4   C99。)