为啥从 main() 显式返回 0 被认为是好的做法? [复制]

Posted

技术标签:

【中文标题】为啥从 main() 显式返回 0 被认为是好的做法? [复制]【英文标题】:Why is explicitly returning 0 from main() considered good practice? [duplicate]为什么从 main() 显式返回 0 被认为是好的做法? [复制] 【发布时间】:2011-05-10 13:07:01 【问题描述】:

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

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

但是,明确包含从 main 中返回是一种很好的做法。`

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

【问题讨论】:

***.com/questions/461449/… 【参考方案1】:

几个原因,

首先,main 被声明为返回 int,所以它应该

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

我只能猜测“Accelerated C++”的作者认为显式返回是一种很好的做法,因为它使您的意图明确。我能想到的唯一其他原因是它使代码与 C90 兼容,但我发现很难相信这会成为一个重要的原因。

【讨论】:

如果我错了,请纠正我,但我认为在 C99 之前,如果可以确定,具有声明返回类型的函数可以合法返回而不指定值(例如基于参数)调用者永远不会尝试使用返回值。并不是说任何人应该写过那样的代码,但我认为在 C99 之前这样的代码是合法的并且不会调用 UB。【参考方案4】:

我认为这个经验法则不太适用于调用exit(),而是在不返回任何内容的情况下退出main(),依赖于隐含的return 0,运行时系统必须在这种情况下执行。

我猜main() 是唯一一个返回值的函数,您可以在其中显式省略返回值。 IMO 这是不依赖该规则的一个很好的理由。

【讨论】:

【参考方案5】:

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

在程序中有一个退出点是放置断点的好地方。

如果您不熟悉程序,使用单一执行流程可以更轻松地跟踪它。

【讨论】:

#1 无关紧要。离开 main 而不显式返回任何内容就是隐式返回 0 至于其他两个,如果你也想有一个单一的退出点,并且表示异常终止,你不能使用return 0; @visitor,你可以有一个变量来跟踪程序状态并返回它。

以上是关于为啥从 main() 显式返回 0 被认为是好的做法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

“按我说的做”,是好的口头禅吗?

Tailwind CSS 还是 Bootstrap?哪个被认为是好的做法? [关闭]

为啥将脚本标签放在正文标签的末尾是好的?

为啥 main 的默认返回值为 0 而不是 EXIT_SUCCESS?

如果单例不好,那么为啥服务容器是好的?

使用 if(...) 时,为啥这被认为是一种好的编程习惯? [复制]