• static的作用


    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变量的初始化和赋值的区别

  • 相关阅读:
    Spark Shuffle FetchFailedException解决方案
    Spark常见问题汇总
    网络表示学习介绍
    Graph Embedding: metapath2vec算法
    spark参数介绍
    spark文章
    集群运行Spark程序实例讲解
    基于Spark UI性能优化与调试——初级篇
    Spark Shuffle FetchFailedException
    没有指针的java语言
  • 原文地址:https://www.cnblogs.com/y4247464/p/12362870.html
Copyright © 2020-2023  润新知