宏定义小知识

宏定义小知识

今天看到一段关于 宏定义 or 宏替换 的代码,感觉挺有意思的,遂记之。

define 除了可以定义常量外,还可以定义任何语句或片段,其格式如下:
#define 标识符 任何语句或片段

例如,我们可以写一个这样的宏定义:#define ADD(a,b) ((a) + (b)) 这样就可以使用 ADD(a,b) 来代替 a+b 了。这里有个问题,为什么要在上面加那么多括号呢?
难道下面这两种写法就不可以吗?

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

Negative! 实际上必须加那么多括号,这是因为宏定义是将对应的部分 原封不动地替换 进去,然后才进行编译和运行。下面让我们来看一个实际的例子!

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

/* 输出结果:4 */

我一开始觉得结果应该是 5 才对!实际上,这就是宏定义的陷阱,它把替换的部分 原封不动 地替换进去!这就导致 CAL(a+1) 实际上是 (a + 1*2 + 1), 也就是 1+1x2+1=4,这就得到了我们的结果,而不是 ((a+1)x2 + 1)

总之,尽量不要使用宏定义来做除了定义常量以外的事情,除非你保险起见,把能给的地方都加上括号。

------本文结束感谢您的阅读 ------
0%