c语言 main()可否省略,main函数中省略返回语句

一、依据

C++标准规定:main函数可以省略返回语句,等效于返回0。

5. A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling exit with the return value as the argument.

If control reaches the end of main without encountering a return statement, the effect is that of executing

return 0;

——ISO C++03 3.6.1 Main function p44/72

——ISO C++98 3.6.1 Main function p43/69

注意:

1. main函数的返回类型是int, 不是void或者其他类型。

2. 该规则仅仅对main函数适用。

3. 对其他函数,如果省略返回值, 将得到一个警告。

4. 应该避免3的情况。

二、 示例

二、1. 一个合法的最小化的完整C++程序如下:

intmain() {}

二、2. 省略的确切含义

同时,标准中的用语是很考究的:

“当控制到达main结束处时没有遇到return语句,效果与返回0相同”。

即是说,标准规定的是“对省略return的分支,认为返回0”。

同时,标准也允许其他分支含有返回语句。

如下:

intmain(intargc,char*[]) {switch(argc)

{case1://error, should passing argumentreturn-1;//parse argumentsdefault:case3://parser argv[2]case2://parser argv[1];

}//do some work//control reaches here}

没有输入命令行参数时, 返回一个错误。

其他情况,当控制达到main的结尾处时,效果同return 0;

二、3. 对于其他函数,没有这种“优待”

如:

intnot_main(intargc) {if(argc<=1)return-1;

}intmain(intargc,char*[]) {returnnot_main(argc);

}

not_main无疑将得到一个警告。

程序在没有输入命令行参数时的返回值将无法预知。

三、验证

三、1. ERRORLEVEL

windows下,可以通过 %ERRORLEVEL% 查询上一次程序返回值。

结果与判断相吻合:

1. minimalist有确定的返回值0

2. omit_return_in_main有确定的返回值-1或0

3. 对omit_return_in_other

3.1 有命令行参数时,返回值确定为0。

3.2 无命令行参数时,返回值无法预知。

三、2 汇编代码

更严谨的验证方法是查看汇编代码。

可以看到,在minimalist与omit_return_in_main的main函数中都有将eax置0的代码。

在omit_return_in_other中的not_main函数中,没有这样的代码。

四、 例外

VC6在这点上与标准不符。

四、1. 对omit_return_in_main,它给出的警告:

warning C4715: 'main' : not all control paths return a value

说明它在这点上与标准不符。

显然,在有命令行参数的时候,程序结果无法预知。

四、2. 对minimalist,它给出的警告很搞笑:

warning C4508: 'main' : function should return a value; 'void' return type assumed

暴露出它另一个与标准不符的地方——main返回void。

显然,任何情况下,程序结果都无法预知。

四、3. 对omit_return_in_other,是程序员的错误。

五、 实践

不知道为什么C++标准在这里开一个“后门”。

——C++在许多地方都是很严谨的。

在实际应用中,尽量不要采用这一特性, 因为:

1. 旧编译器不支持

2. C不支持——如果希望main能同时按C语言编译的话

对于演示用的C++代码,与主题无关的代码行能省则省,则可以使用这一特性。

比如:C++标准中的示例代码几乎都采用了这一特性。

由此可得出,C++标准在这里开后门的原因是——让C++标准更薄^_^

相关链接:

——示例代码

http://immature.googlecode.com/svn/trunk/iMmature/sample/omit_return_in_main

posted on 2009-04-26 14:37 OwnWaterloo 阅读(3082) 评论(1)  编辑 收藏 引用

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值