【问题标题】:Must the int main() function return a value in all compilers? [duplicate]int main() 函数必须在所有编译器中返回一个值吗? [复制]
【发布时间】:2013-08-26 12:09:18
【问题描述】:

为什么在某些 C++ 编译器中使用 int main() 时不需要包含 return 语句?那么 Turbo C++ 呢?

【问题讨论】:

  • AFAIK,Turbo 强制 void main(这是无效的 C++)并为您返回 0。
  • 我很确定 Turbo C++ 完全符合现有的 C++ 标准中的零。据我所知,Turbo C++ 的开发在 1998 年第一个 C++ 标准产生时就停止了。
  • 我希望你是出于对历史的好奇,而不是因为你打算使用一个有 20 年历史的编译器来做任何事情。

标签: c++ turbo-c++


【解决方案1】:

在 C++ 以及 C99 和 C11 中,如果控制流到达 main 函数的末尾,则函数隐式返回 0,这是语言的特殊规则。

【讨论】:

  • @H2CO3 不,不是
  • @H2CO3 “在 main() 中依赖此函数的人将在其他函数中执行相同的操作。”当然不!我可以换一种说法:任何不必要地返回0 的人都可能缺乏线索,所以他们很可能会从函数的末尾掉下来。他们可能也编写了 500 行长的函数 :)
  • 这是一个见仁见智的问题,但我在这里支持@H2CO3。 IMO 对通常规则的这种例外是完全没有根据的,作为任何无用的规则,我觉得它比其他任何事情都痛苦。
  • 让我们面对现实。从 main() 返回主要有一个含义,然后应用程序打算从依赖于返回代码的批处理/脚本/其他任何东西运行。编写此类应用程序/实用程序的人都知道这一点,我认为这没有问题,但地球上谁在乎我从 Microsoft Word 或 Visual Studio 获得哪些返回代码。好吧,我知道,我同意这是一个很好的代码实践,但我不认为这是你能做的最糟糕的事情..
  • @evilruff 你说的有道理,但我宁愿允许void main() (并让运行时将其“转换”为int main() 返回0),而不是让这个奇怪的异常返回规则。但也许这只是我。
【解决方案2】:

在C++和C99/C11中,main函数中没有return语句,默认返回0

§ 3.6.1 主要功能

main 中的 return 语句具有离开 main 函数(销毁任何具有自动存储持续时间的对象)并以返回值作为参数调用 std::exit 的效果。如果控制到达main末尾没有遇到return语句,效果就是执行return 0;

也阅读维基页面C/C++ main function

如果程序员没有定义返回值,则隐式返回 0;在 main() 函数的末尾由编译器插入;这种行为是 C++ 标准所要求的。

【讨论】:

  • 一个小错误:对于C来说,C89不是这样,只有C99和C11支持。
【解决方案3】:

main 必须返回 int,一些编译器,包括 Turbo C++,可能允许其他返回值,特别是 void main,但这是错误的,千万不要使用。

但是在 C++ 中,如果你没有在main 中显式返回值,则它与 return 0; 相同

C++11 §3.6.1 主函数第5节

main 中的 return 语句具有离开 main 函数(销毁任何具有自动存储持续时间的对象)并以返回值作为参数调用 std::exit 的效果。如果控制到达main末尾没有遇到return语句,效果就是执行

return 0;

请注意,对于 C,这仅在 C99 及更高版本中受支持,而 C89 不支持。

【讨论】:

    【解决方案4】:

    标准规定如果没有return 语句,main 将返回0。来自draft C++ standard部分3.6.1段落5

    main 中的

    return 语句具有离开 main 函数(销毁具有自动存储持续时间的任何对象)并以返回值作为参数调用 std::exit 的效果。 如果控制到达main末尾没有遇到return语句,效果就是执行

       return 0;
    

    5.1.2.2.3 部分中的C99 标准草案说:

    如果 main 函数的返回类型是与 int 兼容的类型,则从 初始调用main函数相当于调用exit函数的值 由 main 函数作为其参数返回;10) 到达终止 main 函数返回值 0。

    据我所知,Turbo C++ 的最新版本已经很老了,我找不到任何定义它支持哪个标准的东西。

    【讨论】:

      【解决方案5】:

      无论您是否明确指定,TC 都会返回 EXIT_SUCCESS

      【讨论】:

        【解决方案6】:

        除了符合任意语言标准外,没有令人信服的理由在 main 函数结束时返回值。

        这只是因为流行操作系统上的进程有一个已终止进程的返回码的概念。不难想象他们不需要返回任何值的操作系统。您还可以想象一个世界,其中 0 由所有进程隐式返回,除非以其他方式覆盖——在这种情况下,您可以将返回代码决策委托给系统调用。 (其实这样的系统调用已经以C的exit函数的形式存在了)。

        【讨论】:

          【解决方案7】:

          正如其他人所说,一些编译器不要求您明确地return 0; 但是,(如果可能的话)总是一个好主意。我不鼓励使用任何不允许您从主函数返回的编译器。

          我要说明的是,int main 的返回值很重要,实际上是有用的。

          main 的返回值有时被称为程序中的exit statuserror code,零表示它已成功完成。其他程序和脚本可以访问此代码以确定您的程序是否成功完成。

          更多信息在这里:http://en.wikipedia.org/wiki/Exit_status

          【讨论】:

            猜你喜欢
            • 2013-11-25
            • 1970-01-01
            • 1970-01-01
            • 2018-12-03
            • 1970-01-01
            • 2017-07-31
            • 1970-01-01
            • 1970-01-01
            • 2014-12-06
            相关资源
            最近更新 更多