- 论坛徽章:
- 0
|
本帖最后由 sampher 于 2013-11-21 08:59 编辑
下面这样的代码把main声明为void返回类型,在VC下是能编译通过的,在GCC下编译会提示main必须有返回值。我想知道C/C++标准对此有规定吗? 还是不同时期,不同版本的C/C++标准,对此的规定都不同? 抑或是编译器厂商自己决定的,main()的形式不在标准之内?
5L版主给的回复应该是最佳答案!
----------------------------------------------------------------------------------
main函数的返回值就是运行其程序的这个进程的状态码,命令行程序常常通过判断相应命令(进程)的状态码来判断相应命令是结果是否正常,VC++是允许void main这种形式的程序入口原型的,之所以允许这么做是有历史原因的,在最初的K&R C中main函数的原型为:main(),没有对返回值和参数做出明确规定,为此存在不同main函数原型扩展。K&R C第二版开始对此做出了更细致的规定,除了main()这样的原型以外又加入了带参数的原型:main(int argc, char *argv[]),又由于K&R C中允许Implicit declarations(未经声明而直接使用的将视为int类型,函数返回值也视为int)。main函数原型真正的定型是从C89(第一版ANSI C标准)开始的,此标准明确了int main(void)和int main(int argc, char *argv[])这两个原型,其它的原型是不允许的,考虑到对旧代码的兼容问题,许多编译器也允许K&R C中的原型,不带返回值类型的main视为void或int处理(由编译器决定)。从此以后main逐渐的定型下来,但部分编译器依然存在不同的扩展,比如说带有环境变量参数envp的扩展。总而言之,使用main最好严格按照标准来,否则代码不能保证可移植性。
总之:标准C/C++都对返回值有要求,没标准化之前的没要求,很多编译器为了兼容老代码才允许了返回值原型为void的形式。 |
|