应该返回0;在main()中避免?

时间:2016-08-29 10:04:38

标签: c++ main

我知道当前的C ++标准特殊情况main因此从结尾处掉落与return 0;具有相同的效果,而不是未定义的行为。

我最近惊讶地看到an example at codereview其中的回复不仅指出包含最终的return 0;是可选的,而且实际上是删除原始代码。

因此提示我的问题 - 在主要结尾处使return 0;显式化是否真的被认为是不好的风格?支持或反对的理由是什么?

2 个答案:

答案 0 :(得分:5)

我会在黑暗中采取疯狂的刺,并说人们会陷入两个阵营:

  • 删除该行的人认为它是多余的,所有这些代码都应该是 为简洁而删除

  • 添加该行的人认为它使返回值清晰明确,对于较小的编码人员而言毫不含糊。

就个人而言,我倾向于始终在我的生产代码中的return中写一个有意义的main语句(如果仅因为我的作品main倾向于还包含最终返回0以外的其他内容的代码路径,通常在异常处理程序中),尽管我不会为一个从不返回任何其他内容的普通main而烦恼;例如,我不认为我曾经曾经这样做过,比如一篇关于Stack Overflow演示的Coliru帖子。

有些人会说改变代码库在这两个状态之间翻转是荒谬的,这些论点在宏观方案中都非常弱,并且这样的个人选择不值得冒险引入虫子。

但我说这几乎完全取决于你的环境。如果您在发布周期中途,当然您将进行代码维护改进和样式调整:这是避免产生技术债务的最佳时机,您绝对希望这样做。但是如果您计划直接在生产服务器上进行此更改,或者在该大版本发布前一周进行版本控制,那么您就不在乎了。

(希望你的政策能够防止这种疯狂。代码冻结,是吗?没有改变生产,对吗?)

因此,虽然不言而喻,基本选择是高度主观的,但我们可以量化在事后实施此类选择的风险/收益。

但是不要介意现实生活,Code Review会怎么样?好吧,我不知道;你不得不问他们。就个人而言,在这些具体的例子中,我可能也会删除它,尽管有书面的警告,这纯粹是一种风格选择。 Code Review Meta是否适用于纯粹的样式更改是一个问题。

答案 1 :(得分:1)

从C ++, 3.6.1主要功能

  

(3.6.1 / 5)实现不应预定义主函数。这个   功能不得超载。它应具有返回类型   int,但其他类型是实现定义的。所有   实现应允许以下两个主要定义:

     

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)main中的return语句具有离开的效果   主要功能(销毁具有自动存储持续时间的任何对象)   并以返回值作为参数调用exit。 如果控制   在没有遇到return语句的情况下到达main的末尾   效果是执行返回0 ;

所以,虽然签名表明函数应该返回一些整数,但是return 0没有必要。默认情况下,C ++认为返回值为0。

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

尽管如此,所有这些都是编码惯例的问题。它仍然是程序员的选择!