static关键字用的很多,但是还是不太懂,每次都要查资料。用的时候也是稀里糊涂的,只知道static是静态的,用的最多的也就是静态变量,静态函数基本是瞎用或者不用。用静态变量时,只考虑了静态变量只初始化一次的好处,没有分析过和全局变量有什么区别,今天做个总结,加深一下理解。
分为三个作用点,如下:
1、隔离作用
1.1、作用域和生命周期
借用网上的一张图来看下。
extern 全局变量声明,不是用来定义变量的。
static 修饰定义的。
1.2、说明
全局变量作用域为整个程序,生命周期为整个程序运行期
添加static修饰词后,全局变量或者函数的作用域就修改了,作用域变小了,生命周期还是不变的。
这样就起到了隐藏函数或者当前文件变量的功能,放置其他文件调用。说个不负责的比喻就相当于c++中的private修饰词。
2、保留值
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。可能没有感觉看下面代码:
void Init()
{
static int stat = 0;
if(stat == 1){
return;
}
stat = 1;
printf("===============init===================\n");
return;
}
int main()
{
printf("====================================start=====================================\n");
Init();
Init();
Init();
Init();
Init();
printf("====================================end=====================================\n");
}
如果运行上面代码你会发现“===============init===================”只会打印一次,说明初始化stat=0只执行了一次。
共有两种变量存储在静态存储区:全局变量和 static 变量,只不过和全局变量比起来,static 可以控制变量的可见范围,说到底 static 还是用来隐藏的。
3、初始化值为0
其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是 0x00,某些时候这一特点可以减少程序员的工作量。
总结
1、什么时候用全局变量什么时候用static修饰变量
1、严格来说基本上不要使用全局变量,增加代码的阅读难度,调试难度。能用局部变量解决就用局部变量。
2、要保留值时,可以使用static修饰变量。局部变量也可以添加static来保留值,这样的好处是作用域只是{}范围内
3、没有被本文件以外用到的全局变量和函数,应该都加上static隐藏起来。
4、被其他文件使用到时,则可以用全局变量。