对C语言宏定义的一些总结
QingYuAlive Lv1

符号常量与const常量

符号常量通俗地讲就是“替换”,即用一个标识符来替代常量,又称为“宏定义”或者“宏替换”。其格式如下

1
#define 标识符 常量

例如下面这个例子是把圆周率pi设置为3.14,注意末尾不加分号

1
#define pi 3.14

于是在程序中凡是使用pi的地方将在程序执行前全部自动替换为3.14

另一个定义常量的方法是使用const,其格式如下:

1
const 数据类型 变量名 = 常量;

仍然用pi来举例:

1
const double pi = 3.14

define的其他用法

define除了可以定义常量外,其实可以定义任何语句或片段。其格式如下:

1
#define 标识符 任何语句或片段

例如可以写一个这样的宏定义:

1
#define ADD(a, b) ((a) + (b))

这样就可以直接使用ADD(a,b)来代替a + b的功能:

1
2
3
4
5
6
7
#include <stdio.h>
#define ADD(a, b) ((a) + (b))
int main() {
int num1 = 3, num2 = 5;
printf("%d", ADD(num1, num2));
return 0;
}

输出结果:

1
8

宏定义的陷阱

为什么要在上面加那么多括号呢?直接#define ADD(a, b) a + b不可以吗?或者,为保险起见,是否能写成#define ADD(a, b) (a + b)?实际上必须加那么多括号,这是因为宏定义是直接将对应的部分替换,然后才进行编译和运行。因此像下面这种程序,就会出问题:

1
2
3
4
5
6
7
#include <stdio.h>
#define CAL(x) (x * 2 + 1)
int main() {
int a = 1;
printf("%d\n", CAL(a + 1));
return 0;
}

输出结果:

1
4

这个结果跟我们预想的结果可能不太一致,许多人可能觉得应该是5才对。实际上这就是宏定义的陷阱,它把替换的部分直接原封不动替换进去,导致CAL(a + 1)实际是(a + 1 * 2 + 1),也就是4,而不是((a + 1) * 2 + 1)

 Comments
Comment plugin failed to load
Loading comment plugin