比如我们定义swap函数,我们一般这么写,
#define swap(a,b) \
{\
int t = a;\
a = b;\
b = t;\
}
如果我们如下使用,不会有问题,
int main()
{
int x = 5,y = 8;
swap(x,y);
return 0;
}
因为我们展开就变成如下,
int main()
{
int x = 5,y = 8;
{
int t = x;
x = y;
y = t;
};
return 0;
}
但是我们如果如下使用,就会有问题,
int main()
{
int x = 5,y = 8,z = 10;
if (x > y)
swap(x,y);
else
swap(y,z);
return 0;
}
因为我们展开,变成如下,
int main()
{
int x = 5,y = 8,z = 10;
if (x > y)
{
int t = x;
x = y;
y = t;
};
else
swap(y,z);
return 0;
}
看到第一个swap展开后,后面的;号吗?程序会认为if已经结束,那么else就会认为没有对应匹配的if从而编译失败。
使用do while如下,
#define swap(a,b) \
do \
{\
int t = x;\
x = y;\
y = t;\
}while(0)
使用的重点是while(0)后面不跟;号。