我知道当前c++标准的特殊情况是main
,所以在结束时掉下来与return 0;
有相同的效果,而不是未定义的行为。
我最近很惊讶地在codereview上看到一个例子,其中的回应不仅指出包括最终的return 0;
是可选的,而且实际上已经到了从原始代码中删除的地步。
这就提示了我的问题—在main的末尾显示return 0;
真的被认为是不好的风格吗?支持或反对的理由是什么?
我在这里大胆地说一下,人们分为两大阵营:
-
删除这一行的人认为这是多余的,所有这些代码都应该是多余的删除为简洁
-
添加该行的人认为它使返回值对较少的编码人员来说清晰和明确。
就我个人而言,我倾向于总是在我的生产代码中在main
中编写有意义的return
语句(如果只是因为我的生产main
s往往也包含代码路径,最终返回0
以外的东西,通常在异常处理程序中),尽管我不会为一个从不返回任何其他东西的琐碎main
而费心;例如,我想我从来没有在Coliru的Stack Overflow演示文章中这样做过。
有些人会说,改变代码库在这两种状态之间切换是荒谬的,这些参数在大计划中都是非常弱的,这样的个人选择不值得冒引入bug的风险。
但我想说这几乎完全取决于你的环境。如果您在发布周期的中途,您当然要进行代码维护改进和样式调整:这是避免积累技术债务的最佳时机,并且您绝对希望这样做。但是如果你打算直接在产品服务器上做这个改变,或者在大版本发布前一周在版本控制中做这个改变,那你就疯了。
(希望你们的政策能阻止这种疯狂。代码冻结,对吗?没有更改生产,对吗?)
因此,尽管不言而喻潜在的选择是高度主观的,我们可以量化在事后执行这种选择的风险/收益。
但是不考虑现实生活,代码审查呢?嗯,我不知道;你得去问他们。就我个人而言,对于那些特定的例子,我可能也会删除它,尽管书面警告说这纯粹是一种风格选择。纯粹的样式更改是否适合Code Review是Code Review Meta的问题。
从c++, 3.6.1主要功能
(3.6.1/5)实现不应预先定义主函数。这函数不应过载。它的返回类型应为typeInt,但它的类型是由实现定义的。所有实现应该允许以下两种main定义:
int main() { /* ... */ }
and
int main(int argc, char* argv[]) { /* ... */ }
所以在c++中,main
函数的两个主要签名是:int main()
和int main(int argc, char** argv)
进一步在c++中, 3.6.1主要功能
(3.6.1/5) main中的return语句具有离开Main函数(销毁任何具有自动保存期限的对象)并以返回值作为参数调用exit。如果控制到达main语句的末尾而不遇到return语句,则效果是执行return 0;
所以,虽然签名表明函数应该返回一个整数,但return 0
没有必要。默认情况下,c++认为返回值为0。
优点:
-将main
视为正常函数,并遵循类似的c++编码约定
- return 0
显式指定正常返回值,在其他情况下我们可以返回非零值
虽然,所有这些点都是编码约定的问题。它仍然是程序员的选择!