关于1988年文档中无返回值main()函数语法的技术咨询
关于K&R风格main函数的合法性与语法变迁
这个写法完全合法——它是K&R C(也就是C语言最初的“经典”语法,出自1978年的《The C Programming Language》第一版)的标准函数定义方式,在1988年那个时候是非常常见的写法。下面拆解一下细节:
为什么这个写法在当时是合法的?
- 省略返回类型:在K&R C的规则里,如果函数没有显式声明返回类型,编译器会默认它返回
int类型。所以这个main函数其实和后来标准里的int main()是等价的,只是写法上省略了返回类型声明。 - 参数的分离式声明:K&R C的函数参数定义采用“先列参数名,再单独声明类型”的风格。这里
main(argc, argv)先列出了两个参数名,后面的char *argv[];是专门声明argv的类型;而argc因为没有单独声明类型,会被默认当作int类型(当时的规则:未显式声明类型的变量/参数默认是int)。
为什么现在的C语法不一样了?
这是因为C语言的标准一直在演进,1989年ANSI发布了第一个标准化的C标准(也就是我们常说的C89),之后的C99、C11、C17等后续标准都逐步淘汰了K&R风格的函数定义,转而要求使用原型风格的函数定义,原因主要有两点:
- 可读性与安全性:K&R风格的写法容易产生歧义,比如默认
int的规则可能导致意外的类型转换错误,显式声明所有类型能让代码更清晰,也方便编译器做严格的类型检查,减少bug。 - 标准化统一:原型风格的函数定义是C也支持的写法,这样能让C和C的语法更接近,也便于跨语言的代码交互。
现在的主流编译器(比如GCC、Clang)虽然可能还兼容这种旧写法,但通常会抛出警告,提示你改用现代的标准写法。
等价的现代C写法
把你找到的老代码转换成现在的标准写法,应该是这样的:
int main(int argc, char *argv[]) { // some statements... }
或者也可以写成int main(int argc, char **argv)——在函数参数里,char *argv[]和char **argv是完全等价的,因为数组参数会被编译器隐式转换成指针。
内容的提问来源于stack exchange,提问作者rudicangiotti
相关产品推荐
相关产品推荐

