1、修饰变量
当static来修饰一个变量时,给出了变量的可见范围和生命周期;
1)修饰全局变量时
static int a = 0;
int b = 0;
变量a,b存储在全局数据区。a作用域仅是本文件可见;但b可在其它文件里通过声明extern int b来使用;
2)修饰局部变量时
void f(void){
static int a;
int b = 0;
...
return;
}
函数f中。a为局部静态变量,存储在全局数据区,b为局部变量,存储在栈上;函数退出,b的生命周期也就结束。可是a退出函数时不会被释放,但可见范围为本函数内。当再次进入本函数时,对a的改动是基于上次改动上进行。可以说a有记忆性。
2、修饰函数
static修饰的函数作用域是当前文件,从声明位置或者定义位置,到文件结尾。如果函数没有static,那么作用域为整个工程或者说是项目。很多C项目中都有类似函数,PJSIP中:
/* Open sound dev */
static pj_status_t open_snd_dev(pjmedia_snd_port_param *param);
/* Close existing sound device */
static void close_snd_dev(void);
Linux内核中文件中也很常见此类型的静态函数。
static inline void enable_noirq(void){...}
使用static修饰函数的优点是:全部文件能够定义同名的函数,不用考虑重名导致的编译报错;