挖到一个真正的”远古知识”:K&R 风格的函数定义。这是 C 语言还没标准化的年代(K&R 那本《The C Programming Language》第一版)的写法,现在的编译器为了兼容老代码依然支持。

现代写法 vs 远古写法

1
2
3
4
5
6
7
8
9
10
11
12
13
// 现代写法(ANSI C / C89 之后)
double alt_style(int a, double *real)
{
return *real + a;
}

// 远古写法(K&R 风格)
double alt_style(a, real)
double *real;
int a;
{
return *real + a;
}

特征很明显:参数列表里只写参数名,参数类型声明放在函数体大括号之前。类型声明还可以乱序(先写 real 再写 a),因为它们只是”声明区”,和参数名按位置对应。

为什么被淘汰了

K&R 风格最大的问题是:不带原型。调用方在没有任何声明的情况下调用它,编译器不会检查参数个数和类型,传错了照样编译通过,运行时才出玄学问题。ANSI C 标准化之后引入了函数原型(prototype),编译器从此能在编译期帮你查参数,这种写法就进了博物馆。

现在还认识它的价值:读老项目、老书(K&R 第一版)、还有 Linux 内核早期代码的时候不会懵。GCC 用 -Wold-style-definition 可以检查出这种写法。