为啥从 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?哪个被认为是好的做法? [关闭]