、带参数的宏带参数的仍要遵循上述规则,区别只是宏名后面紧跟的圆括号中放置了参数,就像真正的函数那样。#define <宏名>(<参数列表>) <宏体>注意参数列表中的参数必须是有效的c标识符,同时以,分隔算符优先级问题:
#define COUNT(M) M*M
int x=5;注意:
预编译器只是进行简单的文本替换,COUNT(x+1)被替换成COUNT(x+1x+1),5+15+1=11,而不是36
CUNT(++x)被替换成++x*++x即为67=42,而不是想要的66=36,连续前置自加加两次
解决办法:
用括号将整个替换文本及每个参数用括号括起来print(COUNT((x+1));
即便是加上括号也不能解决第二种情况,所以解决办法是尽量不使用++,-等符号;
分号吞噬问题:
print(COUNT(x+1));
print(COUNT(++X));
//结果输出:11 和42 而不是函数的输出36
宏替换是字符串意义上的替换,并不像函数那样先算一个后算另一个
两个函数相乘,就相当于自动加了括号了,那肯定是要先算函数里面,再算外面
而宏替换之后,涉及加减乘除的,就要看原本的运算优先级
它只替换整个字符串,而不是把结果先算好再放上去