作用1:隐藏
情况:当项目中第一个文件中定义了一个全局变量(即在函数外部定义的变量),而在第二个文件中想要定义一个同名变量,编译会报多重定义的错误
解决:在第一个和第二个文件中的同名变量均用static修饰,问题解决
解析:对于不同文件中的static变量,即使我们为他们的命名相同,但是在编译时,编译器为他们命名是根据他们的位置来命名的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 1static int g_int = 3;
2
3test1.cpp中引用test.c文件
4
5#include<stdio.h>
6#include <stdlib.h>
7#include "test.c"
8void TestSource1()
9{
10
11 g_int= 5;
12 printf("g_int's address in Source1.cpp: %d\n", &g_int);
13 printf("g_int's value in Source1.cpp: %d\n", g_int);
14}
15
16test2.cpp中引用test.c文件
17
18#include<stdio.h>
19#include <stdlib.h>
20#include "test.c"
21void TestSource2()
22{
23
24 printf("g_int's address in Source2.cpp: %d\n", &g_int);
25 printf("g_int's value in Source2.cpp: %d\n", g_int);
26}
27
28
29
30func.c文件声明了函数。
31
32void TestSource1();
33void TestSource2();
34
35
36
37main函数执行测试
38
39 #include<stdio.h>
40#include <stdlib.h>
41#include "func.c"
42void main()
43 {
44TestSource();
45TestSource2();
46
47 system("pause");
48 }
49
50
运行结果:
博客来源:点击跳转
作用2:保持变量内容的持久
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见
PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1#include <stdio.h>
2void fun(){
3 static int count = 0;
4 count++;
5 printf("%d\n", count);
6}
7
8int main(void)
9{
10 for(int count = 0; count <= 10; ++count)
11 fun();
12 return 0;
13}
14
15
运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13 11
22
33
44
55
66
77
88
99
1010
11请按任意键继续...
12
13
作用3:默认初始化为0
其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1变量前不加static和加static的结果:
2int main()
3{
4 //当程序启动时检测文件夹
5 char str[10];
6 printf("%s", str);
7}
8int main()
9{
10 //当程序启动时检测文件夹
11 static char str[10];
12 printf("%s", str);
13}
14
15
运行结果: