这里借鉴一篇文章:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html#undefined
在这里举个例子,先和你说说局部变量和全局变量。
#include <stdio.h> #include <STC89C5xRC.H> void function2(); void function1(); void function3(); unsigned int iii = 0; //初始化全局变量 void main() { TI = 1; while(1) { function1(); function2(); function3(); } } /*局部变量记得初始化*/ void function1() { unsigned int i = 0; //初始化 ++i; printf("i = %d ",i); } void function2() { static unsigned int ii = 0; //初始化 ++ii; printf(" ii = %d ",ii); } void function3() { ++iii; printf(" iii = %d ",iii); }
输出结果为:
主函数前声明了function1(),function2(),function3(),以及声明并且初始化了一个全局变量 iii 。
我们还是先看functon1(),function2()。这两个函数里面都声明并且初始化了局部变量,但是我从输出的数据可以看到,变量 i 的数据在每一次进入function1函数时都进行初始化,并且进行自增 1 , 所以每一次的 i 输出的值每次都是 1.
而function2()函数在声明变量 ii 时,在开头加了static,所以会保存上一次的运算结果,不会再进行初始化。但是作用域也仅仅是在function2(),函数里面。
那么可能会有人问,如果不进行初始化会怎么样???
当然当然是乱套了啦,没有进行初始化,局部变量里面的数值将是随机的,不为人知的数据,所以声明变量的时候还是要对数据进行初始化的。不然的话,程序能不能正确运行都是一个问题。而在这个keil这个开发环境里面,不会警告,不会报错,但是程序不能正确运行。
然后再看全局变量 iii ,输出结果和变量 ii ,相同,但是和变量 ii , 有本质性不同的是,全局变量 iii 可以任意函数使用。而局部变量 ii 只能是function2使用。这些表象不同也是基于数据存储的位置不同而影响到数据的生存。局部变量的数据存储在堆栈段,全局变量存储在数据段。
接下来就说在多个C文件中static的使用:
首先还是要在工程里面添加三个C文件,如下图所示:
main.c
1 #include <stdio.h> 2 #include <STC89C5xRC.H> 3 4 void function3(); 5 extern void function4(); 6 extern void function5(); 7 unsigned int iii = 0; //初始化全局变量 8 void main() 9 { 10 TI = 1; 11 12 while(1) 13 { 14 15 function3(); 16 function4(); 17 function5(); 18 } 19 } 20 void function3() 21 { 22 ++iii; 23 printf("iii = %d ",iii); 24 }
main_2.c
1 #include <stdio.h> 2 static unsigned int iii =10; 3 void function4() 4 { 5 iii++; 6 printf("static iii = %d ",iii); 7 }
main_3.c
1 #include <stdio.h> 2 static unsigned int iii =100; 3 void function5() 4 { 5 iii++; 6 printf("static iii = %d ",iii); 7 }
可以看到三个C文件中,都定义相同的变量 iii ,而且都是各自C文件的全局变量。但是却不冲突。输出的结果如下图所示:
所有的iii,虽然同名,但是,他们不是相同的地址。