荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店