C中的static
说起static,一般想到它的作用是延长变量的生命周期,如果只是这样那么它跟全局变量有什么区别呢?
在C++之前,C语言就有static了,C的static作用很简单,就是不让其他文件的访问自己的全局变量。
C中,我可以用extern来获取其他.c文件定义的全局变量,而static就是让变量对其他文件不可见,有点类似c++的private。
//file1.c
int a = 5; //
static b = 6;
//main.c
extern int a;
extern int b; //会导致链接错误
题外话:强符号与弱符号
.c中 初始化的全局变量是强符号,未初始化的全局变量是弱符号。
强符号只能有一个,弱符号可以有多个,弱符号可以有多个。
链接器在确定符号时,如果只有弱符号,则会选择弱符号。弱符号因为没有初始化,所以会初始化为0
如:
//glb.c
int glb = 5;
//main.c
int glb; //弱符号
...
printf("%d", glb); //输出为5
实际实验发现MSVC中 glb.c和main.c可以通过编译。但是gcc会报符号重复定义的错误。但是gcc中允许 int glb=5; int glb;同时出现在一个文件中,也就是说强弱符号在一个.c文字中是可以的
__attribute(weak)可以强制将符号转为弱符号
题外话:extern
前面说static时,用到了extern来让当前.c可以看见其他.c文件的全局变量,可以说extern int a; 就是全局变量的声明。
其实在C中extern就是用来声明外部接口。如果你在.h中添加了函数声明,编译器默认会为函数声明添加extern