发新话题
打印

[转帖]do-while语句在宏中的应用

[转帖]do-while语句在宏中的应用

信息来源:冰点极限&海阳顶端论坛  作者:浊清


  读过一些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)
可以避免错误的产生。

请大家拍砖。
益友网吧联盟  http://www.96-7.com

TOP

发新话题