何时使用static
- 请况一:当我们定义一个函数,该函数仅限于在定义它的源文件下使用,此时可以使用”static”修饰,以对外界隐藏该函数.
- 情况二:同样,定义一个全局变量,该变量仅在定义它的源文件下使用,此时可以使用”static”修饰,达到隐藏的目的.
- 情况三:对于一个局部变量,如果我们有意不让其存储在栈(自动变量)上,而是存储在静态存储区(.data,.bss),可以使用static修饰.
前两种情况都是限定符号的作用域,第三种情况属于改变变量的生命周期.
static的作用如何实现的
首先清楚c/c++的分离式编译,每个.c文件都首先经过编译成目标文件(.o文件),再经过链接形成可执行文件。
static修改链接属性
使用static修饰全局变量或者函数,其实修饰的都是符号。对编译其来说,以static修饰的符号,其属性的本地属性,即在链接的时候,不会被链接器处理。这样就达到了向外界(其他目标文件)隐藏的目的。
static局部变量(静态局部变量)
静态局部变量仅仅是编译器在编译的时候,在程序的静态存储区(.bss,.data)为该变量预留空间。未初始化的静态局部变量存储在.bss段,已初始化的静态局部变量存储在.data。其生命周期就从初始化时刻到程序结束。栈上变量(自动变量)的生命周期只局限函数内部。
static和extern
extern并不能改变static的作用效果。
extern关键字的作用仅仅是告诉编译器,该符号的定义在外部。
- 对于全局变量来说,extern的作用是告诉编译器,该符号在其他源文件里面。
- 对于函数来说,extern的作用和#include “*.h”的作用是相似的,相当于声明。在两个目标模块的联系仅仅是几个函数,就可以使用这种方法,而不需要include包含整个头文件。