static部分转载于博文:static的作用
static在嵌入式C编程中很常见,现总结一下其作用:
1、隐藏
当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性
示例:同时编译a.c 与 main.c
1 #include <stdio.h> 2 char a = 'A'; // 全局变量 3 void msg() 4 { 5 printf("Hello "); 6 }
1 #include <stdio.h> 2 3 int main() 4 { 5 extern char a; //提示编译器,变量可能在其他模块中定义 6 printf("%c ",a); 7 (void)msg(); 8 return 0; 9 }
编译
linux@linux:~/code$ gcc a.c main.c -o hello linux@linux:~/code$ ./hello A Hello
为什么在a.c中定义的全局变量a和函数msg可以在main.c中使用?因为所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件如main.c也能访问。
加了static,就会对其他源文件隐藏。例如在a与msg前加上static,main.c就不能找到他们。
linux@linux:~/code$ gcc a.c main.c -o hello /tmp/ccfqGr8L.o: In function `main': main.c:(.text+0xc): undefined reference to `a' main.c:(.text+0x24): undefined reference to `msg' collect2: error: ld returned 1 exit status
利用这一static的特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
1)保持变量内容的持久:存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化, (static修饰的局部变量只有在整个程序结束的时候才会自动释放。若下次调用该局部变量所在的函数时,不需要对它重新声明,且会保留上一次调用存入的值。)
示例程序:求1-5的阶乘:代码源自:static静态变量的理解
6 # include <stdio.h> 7 8 long factor(int n) 9 { 10 static long int f=1; //static 11 f*=n; 12 return f; 13 } 14 15 void main(void) 16 { 17 int i; 18 for(i=1; i<=5; i++) 19 printf("%ld ",factor(i)); 20 }
运行结果:
linux@linux:~/code$ ./a.out 1 2 6 24 120
由于f为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。若变量f说明为自动变量(去掉static),当main中多次调用factor时,f均赋初
值为1,故每次输出值均为f = 1 * n
linux@linux:~/code$ ./a.out 1 2 3 4 5
2) static变量不初始化时,默认初始化为0
static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。
最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
static的初始化与赋值可详见:static变量的初始化和赋值的区别