static的作用 static的作用 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\n"); 
6 }
1 #include <stdio.h>
2 
3 int main()
4 {
5     extern char a;   //提示编译器,变量可能在其他模块中定义
6     printf("%c\n",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\n",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

猜你喜欢

转载自www.cnblogs.com/y4247464/p/12362870.html
今日推荐