为什么从main()显式返回0被认为是良好的做法?

时间:2010-11-15 23:30:35

标签: c++

  

可能重复:
  return statement vs exit() in main()

我刚刚阅读了Accelerated C++的第一章(看起来像一本很棒的书),最后作者说了

  

然而,明确地包括从主要回归是一种良好的做法。

为什么这被认为是好习惯?在C99中,我总是省略return 0,使用exit()表示程序异常终止,并且从未错过显式返回。

5 个答案:

答案 0 :(得分:7)

有几个原因,

首先,声明main返回int,因此它应该

其次,也许更重要的是,对于C ++,main的exit()将跳过在main中调用本地对象实例的析构函数。

答案 1 :(得分:4)

在C99和C ++中,如果程序的执行到达main()函数的右括号,则执行隐式return 0;。在C90中情况并非如此 - 如果没有明确的main()到达return的末尾将导致返回不确定的值(严格来说,行为未定义)。

我只能猜测“加速C ++”的作者认为明确的回归是好的做法,因为它使你的意图明确。我能想到的另一个原因是它使代码与C90兼容,但我发现很难相信这会有很大的重要性。

答案 2 :(得分:1)

调用程序(通常是OS shell)可以收集返回代码并知道程序是否失败。

从程序中获得一个退出点是一个放置断点的好地方。

如果您不熟悉程序,只需一个执行流就可以更轻松地执行该程序。

答案 3 :(得分:1)

我认为这个经验法则并不适用于调用exit(),而是在没有返回任何内容的情况下脱离main(),依赖于隐式return 0运行时系统在那种情况下做。

我猜main()是返回值的唯一函数,您可以省略显式返回值。国际海事组织这是一个非常好的理由不依赖这一规则。

答案 4 :(得分:-1)

通过C ++标准main()应该返回int。这是一个错误代码应用程序在其终止时返回,实际上,当调用进程想知道此应用程序是否成功终止(通常错误代码在这种情况下为0)或失败时,这很有用。

我将给出一个Microsoft特定示例,但它显示了返回错误代码的一般需求: ProcessA需要创建ProcessB并等待它终止,之后它想要检查ProcessB是否成功执行。 ProcessA将使用CreateProcess函数创建ProcessB,然后将使用ProcessB的句柄等待其终止,然后使用GetExitCodeProcess函数获取ProcessB终止代码 - 这是从main()返回的int值。