C++中的static关键字

释放双眼,带上耳机,听听看~!

作用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

运行结果:
C++中的static关键字
博客来源:点击跳转

作用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

运行结果:
C++中的static关键字

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Http模块(2) CNodejs爬虫实现

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索