1、隐藏
当同时编译多个文件时,所有未加static关键字的全局变量和函数都具有全局可见性。
例如:同时编译两个源文件
//ghz.c #include <stdio.h> char a = 'g'; void GHz(){ printf("I'm GHz "); } //main.c #include <stdio.h> #include <stdlib.h> int main() { extern char a; //引用已声明变量 printf("%c ",a); GHz(); return 0; }
输出:
如果加了static,ghz.c文件就会对其它源文件隐藏。例如在a和GHz的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。
2、记忆功能和全局生存期
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。存储在静态数据区的变量有两种,一种是全局变量,另外一种即static修饰的静态变量,只不过静态变量和全局变量比起来静态变量能够控制变量的可见范围(如果static变量声明在函数内部作为局部变量,那么它的生存期为整个源程序,但是它和自动变量的作用域一样,只能在定义该变量的函数内使用)
例:
#include <stdio.h> #include <stdlib.h> int f(int *p) { static int j =0; p[j++] += 1; p[j++] += 1; return 0; } int main() { int a[5] = {1,2,3,4,5}; int i = 0; for(i = 0; i < 2;i++) f(a); for(i = 0; i < 5; i++) printf("%d ",a[i]); return 0; }
输出: