信息来源:冰点极限&海阳顶端论坛 作者:浊清
读过一些Linux内核源码的朋友一定见到过不少用do-while结构的宏,并且是do...while(0)。用意何在呢?这就是本短文讨论的内容。
假设需要一个宏来交换两个整数,我们可能这么写:
#define EXCHANGE(a,b) \
a = a + b;\
b = a - b;\
a = a - b;\
然后这样调用:
main()
{
int m=5, n=3;
if (m>4){
EXCHANGE(m,n);
}
else{
EXCHANGE(m,n);
}
printf("%d, %d",m,n);
getch();
}
似乎一切正常。但是如果这样调用:
main()
{
int m=5, n=3;
if (m>4)
EXCHANGE(m,n);
else
EXCHANGE(m,n);
printf("%d, %d",m,n);
getch();
}
编译就会出错。因为宏展开后,
EXCHANGE(m,n);
会多出一个分号,即使将宏的定义改成
#define EXCHANGE(a,b) \
{a = a + b;\
b = a - b;\
a = a - b;}\
也无济于事。正确的做法是用do-while语句:
#define EXCHANGE(a,b) \
do{\
a = a + b;\
b = a - b;\
a = a - b;\
} while (0)
可以避免错误的产生。
请大家拍砖。