本文对#define 定义的有宏参数替换进行描述,望觉得对你们有帮助的程序猿们小小点赞一下。
一.#define定义宏
#define 机制允许把参数替换到文本中,这种实现通常称为宏(marco)或定义宏(define marco)
下面是宏的声明方式:
#define name(parament-list)stuff
注意:参数列表左括号必需与name相连
如
#define SQUARE(x) x*x
这个宏接收一个参数
SQUARE(5)
运行程序时,预处理器就会用下面这个表达式替换上面的
#define SQUARE(5) 5*5
结果为25。
但这个宏还存在问题
观察下面的代码
int a=5; printf("%d", SQUARE(a+1))
答案并不是我们认为的36
事实上,它输出的结果是11
为什么?
替换文本时,x被替换为 a+1
然后 语句实际为:
printf("%d", a+1*a+1)
结果自然为11
改进方法也很简单,在宏定义是加上两个括号
#define SQUARE(x) (x)*(x)
再次运行
printf("%d", (a+1)*(a+1))
结果为36
你以为代码就完善了吗
还有一个宏定义
#define ADD(x) (x)+(x)
int a=5; printf("%d",10* ADD(a))
你认为结果是多少
100 or 其它
太年轻了
请看代码
运行替换完后:
int a=5; printf("%d",10*(5)+(5 ))
结果为 55
怎么改进呢,
也是加上一个括号
#define ADD(x) ((x)+(x))
再次运行变为
printf("%d",10*((5)+(5) ))
结果自然为100。
二.宏参数的副作用
这里的副作用指的是改变了其它的值
如
int a=1; int b; b=a+1;
上述代码在给吧b赋值的时没有改变a的值
无副作用
而
int a=1; int b; b=a++;
给b赋值的同时改变了a的值
就产生了副作用
当宏参数在宏的定义中出现超过一此的时候,如果参数带有副作用,那么你在使用宏时会带来不可预测的效果。
代码如下
#define MAX(a,b)(a)>(b)?(a):(b) ... x=3; y=4; z=MAX(x++,y++) printf("%d %d %d",x,y,z);
根据上述内容可以尝试算一算
解析如下:
z=(x++)>(y++)?(x++):(y++) //明显x++<y++,所以结果再进行一次y++ //x=4,y=6,z=5