zoukankan      html  css  js  c++  java
  • 多文件中的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,虽然同名,但是,他们不是相同的地址。

  • 相关阅读:
    你所知道的微服务技术栈有哪些?请列举一二
    Spring Cloud核心组件,在微服务架构中,分别扮演的角色:
    两种跳转方式分别是什么?有什么区别?
    forward 和redirect的区别 ?
    Request对象的主要方法:
    Struts2 的封装方式有哪些?
    使用继承有什么好处?
    当数据需要进行大量更改时, String和StringBuffer谁是更好的选择?
    数组和向量之间有什么区别?
    启动一个线程是调用run()还是start()方法?
  • 原文地址:https://www.cnblogs.com/zhouhaocheng---yijianqinxin/p/8337971.html
Copyright © 2011-2022 走看看