在main()函数中,应该避免使用return 0吗?

5

我知道当前的C++标准特例处理main函数,让其在结尾处没有显式返回也可以与return 0;一样正常运行,而不是产生未定义的行为。

最近我看到了一个在codereview上的例子,评论中不仅指出包含最终的return 0;是可选的,甚至还把它从原始代码中删除了。

那么我想问,将return 0;放在main函数的末尾是否真的被认为是不好的编程风格?支持或反对的理由是什么?


2
可能是重复的问题?https://dev59.com/7HVC5IYBdhLWcg3wtzkQ - KostasRim
9
将其从代码中删除是在生产环境中的行为既荒谬又不可取。每次我们接触代码时,都有引入错误的机会。代码应该在必要时修改,而不是因为它没有按照个人喜好展示。 - Richard Hodges
1
@KostasRim:那并没有回答我的问题。(事实上,最佳答案明确地回避了我的问题) - user1084944
2
代码风格往往是个人观点的问题。我通常添加返回值以避免与不了解此事的人混淆。此外,我更喜欢使用EXIT_SUCCESS,EXIT_FAILURE宏,这样我就可以避免硬编码返回代码。 - Hayt
1
如果main函数没有返回任何有意义的内容,那么我不会随意添加它(为什么要麻烦呢?当你没有任何有意义的东西可返回时,为什么要给人留下这样的印象呢?)。如果main函数返回成功或失败,则我总是使用EXIT_SUCCESS/EXIT_FAILURE。我永远不会将其添加到一个微不足道的代码示例中,因为你唯一需要关注的是所讨论的问题。 - Galik
显示剩余4条评论
2个回答

4
我猜人们分为两类:一些人认为删除这行是多余的,应该删除所有这样的代码以减少长度;另一些人则认为添加该行可以使返回值对较差的程序员清晰易懂。
就我个人而言,在生产代码中,我倾向于始终在main函数中编写有意义的return语句(即使只是因为我的生产main函数通常也包含以其他方式返回某些值的代码路径,通常在异常处理程序中),但是如果一个trivial的main函数从来不返回任何东西,那么我不会费心去编写有意义的return语句。例如,我从来没有在Coliru帖子中为了Stack Overflow演示而这样做过。
有人会说,更改代码库以在这两种状态之间进行切换是荒谬的,这两个参数在很大程度上都很薄弱,并且这种个人选择不值得冒引入bug的风险。
但我会说,这几乎完全取决于您的环境。如果您已经完成了一次发布周期的一半,当然您将进行代码维护改进和样式调整:这是避免技术债务的最佳时间,您绝对想要这样做。但是,如果您计划直接在生产服务器或在版本控制中在大型发布的一周之前进行此更改,那么您就疯了。
(希望您的政策可以防止这种疯狂。代码冻结,是吗?不要对生产进行任何更改,对吧?)
因此,尽管毫无疑问,底层选择高度主观,我们可以在事后量化强制执行这样的选择的风险/收益。
但现实又如何?Code Review呢?好吧,我不知道,你得去问他们。就这些具体例子而言,个人认为我也会将其删除,尽管这只是一个样式选择的声明。纯粹的样式更改是否适用于Code Review是Code Review Meta的问题。

0

来自C ++,3.6.1 主函数

(3.6.1/5)实现不得预定义main函数。此函数不得重载。它必须有一个返回类型为int的返回类型,但其类型是实现定义的。所有实现都应允许以下两个main的定义:

int main() { /* ... */ }

int main(int argc, char * argv []) { /* ... */ }

因此,在C ++中,main函数有两种明显的签名:int main()int main(int argc, char ** argv)

进一步地,在C ++中,3.6.1主函数

(3.6.1/5)在主函数中的返回语句会导致离开主函数(销毁任何自动存储期间的对象),并调用exit,并将返回值作为参数。如果控制在未遇到return语句的情况下到达main的末尾,则效果相当于执行return 0;

因此,尽管函数的签名表明应该返回某个整数,但不必要return 0。默认情况下,C++认为返回值为0。

优点:
- 将main视为普通函数,并遵循类似的C++编码约定
- return 0明确指定正常返回值,在其他情况下我们可以返回非零值

虽然所有这些都是编码约定的问题。 这仍然是程序员的选择!


更像是三个显著的签名:int main(int argc, const char **argv, const char **env) - user6266288
4
根据标准,只有两个。 - songyuanyao
1
从技术上讲,这当然取决于你所谈论的标准。C++标准只批准了两个签名。然而,Posix添加了第三个签名。 - Martin Bonner supports Monica
我并没有看到这个回答解决了问题。 - Lightness Races in Orbit
3
大部分回答只是重复问题的前提。唯一接近回答问题的部分是“优点:将 main 视为普通函数并遵循类似的 C++ 编程规范。这是程序员的选择”。不是很有价值的内容... - Lightness Races in Orbit
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接