一.根据
C标准规定,main函数可以省略返回语句,并等效于返回0。
5.areturnstatementinmainhastheeffectofleavingthemainfunction (destroyinganyobjectswithautomaticstorageduration ) andcalling
ifcontrolreachestheendofmainwithoutencounteringareturnstatement,the effect is that of executing
返回0;
3354 ISOC 033.6.1 mainfunctionp 44/72
3354 ISOC 983.6.1 mainfunctionp 43/69
注意:
1. main函数的返回类型是int,不是void或其他类型。
2 .此规则仅适用于主函数。
3 .对于其他函数,如果省略返回值,则会收到警告。
4.3的情况应该避免。
二.例
二、1 .合法最小化的完整C程序如下。
intmain () }
二.二.省略的确切含义
同时,标准术语得到了很好的研究。
“如果控件到达main结尾时没有遇到return语句,则效果与返回0相同。”
也就是说,标准规定“对于省略了return的分支,我认为返回0”。
标准情况下,其他分支也可以包含返回语句。
如下所示。
intmain(intargc,char*[] ) switch(argc ) ) ) ) ) ) ) ) )。
{case1://error,shouldpassingargumentreturn-1; //parseargumentsdefault : case 3://parser argv [2] case 2://parser argv [1];
//dosomework//controlreacheshere }
如果未输入命令行参数,将返回错误。
否则,当控件到达main末尾时,效果与return 0相同;
二、三.关于其他函数,没有这样的“优待”
例如:
intnot_main(intargc ) if ) argc=1) return-1;
}intmain(intargc,char*[] ) return not _ main (argc );
}
not_main肯定会收到警告。
没有输入命令行参数的程序的返回值无法预测。
三.验证
三、一、1. ERRORLEVEL
在windows上,您可以在%ERRORLEVEL%中查询上次程序的返回值。
结果与判断一致:
1. minimalist有确定的返回值0
2. omit_return_in_main具有固定的返回值-1或0
对于omit_return_in_other
3.1如果存在命令行参数,则将返回值确定为0。
3.2如果没有命令行参数,返回值将无法预测。
三.二汇编代码
更严密的验证方法是查看汇编代码。
可以看到minimalist和omit_return_in_main的main函数都有将eax设置为0的代码。
omit_return_in_other的not_main函数中没有这样的代码。
四.例外
VC6在这方面不符合标准。
四.对omit_return_in_main给予的警告:
warningc 4715: ' main ' : notallcontrolpathsreturnavalue
表示在这一点上与标准不一致。
很明显,如果有命令行参数,程序结果将无法预测。
四、2 .对于minimalist,它发出的警告很有趣:
warningc 4508: ' main ' : functionshouldreturnavalue; ' void' return type assumed
暴露不符合标准的其他地方——main回到void。
当然,在任何情况下,程序的结果都是无法预测的。
四、三、对于omit_return_in_other,是程序员的错误。
五.实践
不知道为什么c标准在这里做了“后门”。
——C在很多地方很严格。
在实际应用中,尽量不要采用这一特性。 因为:
1 .不支持旧编译器
2. C不支持——。 如果你希望main能同时用c语言编译
在演示用的C代码中,如果可以省略与主题无关的代码行,就可以使用这个特性。
例如,C标准的示例代码几乎都采用了这一特性。
由此可见,C标准在这里打开后门的理由是——使C标准更薄^_^
相关链接:
——示例代码
3358 immature.Google code.com/SVN/trunk/immature/sample/omit _ return _ in _ main
posted on 2009-04-2614336037 own waterloo阅读(3082 )注释)1)编辑集合引用