多文件中的static

这里借鉴一篇文章: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,虽然同名,但是,他们不是相同的地址。

原文地址:https://www.cnblogs.com/zhouhaocheng---yijianqinxin/p/8337971.html