使用场景
- 全局变量或函数。当不希望其他源文件访问这个全局变量或者函数时。
- 局部变量。当希望局部变量在函数在每次调用结束后不被立刻释放时。
全局变量或函数
未加static的函数的代码示例
文件 count.c 内有代码:
int add(int num1,int num2){
return num1 + num2;
}
文件 result.c 访问 count.c 文件的函数 add :
#include <stdio.h>
extern int add();
int result = add(1,3);
int main(){
printf("%d\n",result);
}
执行result.c 文件的结果为: 4
当我们把 count.c
函数前添加了static的代码示例
文件 count.c 内有代码:
static int add(int num1,int num2){
return num1 + num2;
}
文件 result.c 访问 count.c 文件的函数 add :
#include <stdio.h>
extern int add();
int result = add(1,3);
int main(){
printf("%d\n",result);
}
执行result.c 文件的结果为: 报错:无法解析函数
原理
全局变量和函数是有外部链接属性的。也就是其他源文件可以通过关键字extern来访问。这个时候你不想这个全局变量或者函数被其他源文件访问,那你就可以在全局变量和函数前加static。加入static后,外部链接属性就变为内部链接属性。即使通过extern也访问不了了
局部变量
未加static的局部变量的代码示例
int numb(){
int num = 0;
num = num + 1;
return num;
}
int main(){
for(int i = 0; i < 10; i++){
int result = numb();
printf("%d\n",result);
}
}
其结果为: 1111111111
局部变量前添加static的代码示例
int numb(){
static int num = 0;
num = num + 1;
return num;
}
int main(){
for(int i = 0; i < 10; i++){
int result = numb();
printf("%d\n",result);
}
}
其结果为: 12345678910
原理
- 局部变量时存储在栈区的。生命周期时是由OS管理的。每次函数调用结束后,局部变量被释放
- 当局部变量前加了static后,局部变量存储在静态区。每次函数调用结束后,局部变量不会被释放,直到程序结束才被释放,且只执行一次。
- 静态区的局部变量的作用域没有被改变。
|