do while(0) 用法
www.diybl.com 时间 : 2009-03-07 作者:匿名 编辑:sky 点击: 1141 [ 评论 ]
#define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo() do{}while(0) 2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。 3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现: #define foo(x) \ action1(); \ action2(); 在以下情况下: if(NULL == pPointer) foo(); 就会出现action1和action2不会同时被执行的情况,而这显然不是程序设计的目的。 4,以上的第3种情况用单独的{}也可以实现,但是为什么一定要一个do{}while(0)呢,看以下代码: #define switch(x,y) {int tmp; tmp=x;x=y;y=tmp;} if(x>y) switch(x,y); else //error, parse error before else otheraction(); 在把宏引入代码中,会多出一个分号,从而会报错。 //------------------------------------------------ 使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元, 从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无 用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。 为什么很多linux内核中宏#defines用do { ... } while(0)? 有很多原因: (Dave Miller的说法): 编译器对于空语句会给出告警,这是为什么#define FOO do{ }while(0); 给定一个基本块(局部可视域),定义很多局部变量; (Ben Collins的说法): 在条件代码中,允许定义复杂的宏。可以想像有很多行宏,如下代码:
|
联系客服