荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: sixue (hello,tomorrow!), 信区: Program
标  题: Re: 问个循环的问题
发信站: 荔园晨风BBS站 (2005年03月13日16:15:30 星期天), 站内信件

        原来如此:


宏定义怪圈
#define  wait_event(wq,condition)  \
do{  \
if(condition)  \
                           break;  \
             __wait_event(wq,condition);  \
}while(0)


明明这句话只执行一次,为什么还还用do-while语句呢?

假设有这样一个宏定义
#define  macro(condition)  \
if(condition)  dosomething();
现在在程序中这样使用这个宏:
if(temp)
             macro(i);
else
             doanotherthing();
一切看起来很正常,但是仔细想想。这个宏会展开成:
if(temp)
             if(condition)  dosomething();
else
             doanotherthing();
这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过
了,但是运行的结果一定是错误的。为了避免这个错误,我们使用do{….}while(0)  把它
包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的
编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会
导致程序的性能降低。
这个用法在linux源码中很常见。

【 在 sixue (hello,tomorrow!)
的大作中提到: 】:     macro   :     FILL_IT(A,B){ :         do{
:             A->oh = B;
:         }while(0)
:     }
:     为什么while(0)的?
:     那循环了多少次?


--
     多想和你

     相知相爱


※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.14.156]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店