总结卡片:
关键字static可以用于函数、全局变量与局部变量。
static用于函数时,起隐藏作用,函数只在当前源文件可见,其它源文件不能使用。比如有两个.c文件:hello1.c跟hello2.c,hello1.c中定义了函数say1,不加static时,hello2.c中可通过extern声明一下,就可调用say1:
如果hello1.c不想别的源文件知道或调用到say1,也不想跟别的源文件的say1有命名上的冲突,那就给say1加上static,达到隐藏作用,这时hello2.c再调用say1在编译时就会报错:
static用于全局变量,只起隐藏作用,跟用于函数一样的作用。加不加static,全局变量都在静态存储区分配空间,在执行到main函数前就已经存在并完成初始化(默认初始化为0),在程序退出前static变量一直存在。
static用于局部变量,起常驻作用,局部变量的作用域没有变,但它变成了静态存储变量,跟全局变量一样一直存在于程序的生命周期中,比如:
#include <stdio.h>
void callme() {
static int times;
times++;
printf("callme %d timesn", times);
}
int main() {
for(int i=0;i<10;i++) callme();
return 0;
}
执行效果:
编译器(比如cc)在编译时就添加代码,为static变量分配存储空间,并进行初始化,所以要求static变量初始化为常量,把static变量初始化为另一个变量是通不过编译的,比如这样不行:
int x = 2;
static int a = x;
但这样可以(即常量初始化):
const int x = 2;
static int a = x;
编译器设置好内存与初始化值,在程序加载运行,在执行到main函数之前,static变量就执行完分配空间与初始化的代码。