我们知道宏和typedef有相似之处,就是他们都可以进行类似于替换的功能。此处对于宏的用法,替换的时候不免有些坑,如下:
#define ADD(x, y) x+y
int main()
{
int a = ADD(10,20) * ADD(10, 20);
printf("%d\n", a);
return 0;
}
我们在上面宏定义的是一个加法的函数内容是x+y,然后我们输入x为10,y为20,x+y得到结果为30,ADD*ADD按常理来说是900,但实际结果是230。我们必须注意的是在预处理阶段编译器会将宏进行替换,相当于 int a = x + y * x + y;显然它不是纯粹的两个数的积相乘。那么我们个办法就是改成#define ADD(x, y) (x+y);好像这样就能解决问题。但是新的BUG又出现了如下代码:
#define MUL(x, y) (x+y)
int main()
{
int a = MUL(10,10 + 10) ;
printf("%d\n", a);
return 0;
由于上面的教训,我们做了处理之后,然后计算,我们应该预期想要的是1020=300的结果,但实际是1010+10=110的结果,接下来我们必须对x,y自身加上括号。
虽然有时候宏能够完成函数的功能,但是宏的坑有点多,所以我们能用函数尽量用函数