常量
# 常量
//
// Created by virus on 2022/5/20.
//
#include "stdio.h"
int main() {
// 常量 或者 称呼为只读变量
const int kRed = 0xFF0000;
const int kGreen = 0x00FF00;
const int kBlue = 0x0000FF;
printf("kRed: %d\n", kRed);
// 获取它的指针地址
int *p_k_red = &kRed;
// 强制的修改
*p_k_red = 0;
printf("kRed: %d\n", kRed);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
虽然说上面最终的打印结果是一样的,是因为编译器对常量进行了优化处理,但是我们通过debug
打断点的时候,其实值以及改了。
所以这里,常量其实可以称之为只读变量,其实真正的const
是没法修改的。
下面说一个宏,是#define
开头的,要比const
常量一点。
//
// Created by virus on 2022/5/20.
//
#include "stdio.h"
// 宏
#define COLOR_RED 0xFF0000
int main() {
printf("COLOR_RED: %d\n", COLOR_RED);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
等到了编译预处理的时候,这些
COLOR_RED
会完全被下面的值所替代,以及我们写的所有注释也会被清理掉,其实我们最上面写的#include <stdio.h>
也是一个宏处理,预处理的时候会把它的所有文件都拿过来。我们可以使用gcc -E demo1.c -o output.c
可以得到预处理后的c 源文件
int main() {
const int kRed = 0xFF0000;
const int kGreen = 0x00FF00;
const int kBlue = 0x0000FF;
printf("kRed: %d\n", kRed);
int *p_k_red = &kRed;
*p_k_red = 0;
printf("kRed: %d\n", kRed);
printf("COLOR_RED: %d\n", 0xFF0000);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
可以看到原先的 COLOR_RED
以及被完全替换掉了,上面的stdio
的我没赋值下来,因为太多了,就不放了,可以自己尝试去查看内容。
我们可以对宏进行取消
#undef COLOR_RED
// 之后就获取不到对应的值
1
2
3
2
3
# 真正的常量:字面量literal
3;
3u;
3l;
3.f;
3.9;
'c';
"cs";
L'中';
L"中国";
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
但是呢,我们尽量不要在代码里使用硬编码就是上面的字面量。可以推荐使用宏。
编辑 (opens new window)
上次更新: 2022/05/20, 23:36:00