1.10-静态变量与静态函数的声明与定义

对于一个静态变量或者静态函数,是不是每一处声明的地方,都需要包含 static 关键字呢?

事实上,编译器对变量和函数的处理是不同的。对于变量,如果你要声明一个静态变量,那么在第一次声明的时候,就必须要加上 static 关键字,且之后的所有的声明都必须加上 static 关键字,否则编译器会报错。例子如下:

1
2
3
4
5
6
7
int v1;
static int v2;
static int v3;

staic int v1;
int v2;
extern int v3;

这个例子中,只有 v3 是正确的,v1 和 v2 都会出现“静态声明在非静态声明之后”的错误。

所以以后在写静态变量的声明和定义的时候,最好都加上 static 关键字。

那么,编译器对静态函数的处理,是否也是这样的呢?答案是否定的,我们再写一个例子:

1
2
3
4
5
6
7
int f1();
static int f2();
static int f3();

static int f1();
int f2();
extern int f3();

可能你会以为这次,编译器会报 f1 和 f2 的错误,其实只有 f1 的声明是错误的,f2 通过了编译。

从这,可以看出,静态函数的声明,只要保证第一次的声明加上了正确的 static 关键字,其后的声明可以不加,这是和静态变量的声明不同的地方。

总结起来,静态函数/变量的声明,在第一次声明是必须要加上 static 关键字的,而在之后的声明,函数可以不加,变量必须加。但是建议以后编码的时候,还是保持所有的声明和定义的一致性,有利于代码阅读。