在学习C语言函数指针的过程中,我发现了函数的参数列的一些问题:无论参数部分是否填入类型,编译均可通过。
查阅资料后发现C语言中有两种函数参数风格:ANSI和K&R。ANSI是我们所学习的风格;K&R则是老式的,是编写Linux内核所使用的风格。
int foo(void) 还有 int foo(int a, int b)就是ANSI风格的。它的特点是参数都有类型
对应的,int foo() 和 int foo(a,b)是K&R风格,它使用初始化列:
//无参数的K&R风格接受任何参数,后者的声明方法是接受两个任意类型的参数
int foo(); //int foo(a,b);
//参数类型声明在函数体前面
int foo(a, b)
int a;
int b;
{
return a+b;
}
当我们写下int foo()的时候,我们实际上已经在不知不觉中使用了K&R风格的函数声明了!当然后面的函数体部分奇怪的结构仅限C编译器,这些代码以cpp后缀编译时无法通过。
函数调用时,编译器检查的是函数声明。因此假如函数声明是形如int foo()的,无论我们函数体中实际传入多少参数,编译都不会报错。这使得很多情况下我们无法检查出问题。因此并不推荐这样的写法。
因此在绝大多数C开发中,我们应该使用ANSI风格,在没有参数的函数都要在参数部分注明void,以便编译器进行参数检查,从而尽可能地减少人为的错误。
拓展:K&R风格不仅包括函数参数,还有其他一系列约定。列举一些有趣的内容:
1. 使用8个字符缩进:有人可能抱怨缩进导致一行无法容纳许多字符。但是他们的看法是,超过3级缩进说明代码需要重构
2. 命名尽量通俗:以变量类型命名的微软经常开发出糟糕的代码
3. 大括号的位置:非函数语句起始大括号在行尾,结束大括号在行首;函数语句的大括号都在行首
当然这些内容仁者见仁智者见智了。