由linux中的一个宏定义引发的思考
2007-03-02 12:59
337 查看
var stattitle='【推荐】由linux中的一个宏定义引发的思考'; 有时候会在linux的程序中看到这样的宏定义:
#define wait_event(wq,condition)/
do{/
if(condition)/
break;/
_wait_event(wq,condition);/
}while(0)
这里到底是在做什么呢?这个循环不是只作一次么?
假设定义了这样的一个宏:
#define macro(condition)/
if(condition) dosomething();
在这样的情况下使用这个宏:
if(temp)
macro(i);
else
doanotherting();
那么这样的话展开成是这样的:
if(temp)
if(i) dosomething();
else
doanotherthing();
这样的话问题就出现了,else与第二句匹配了。
这样的宏定义是有测效的,上面的那种用空循环的方法是种解决的途径。
因为一般的编译器对这种无用的循环都进行优化。
个人觉得如果我们在if(condition)dosomething();外面加上花括号的话是不是能够得到同样的效果。
#define wait_event(wq,condition)/
do{/
if(condition)/
break;/
_wait_event(wq,condition);/
}while(0)
这里到底是在做什么呢?这个循环不是只作一次么?
假设定义了这样的一个宏:
#define macro(condition)/
if(condition) dosomething();
在这样的情况下使用这个宏:
if(temp)
macro(i);
else
doanotherting();
那么这样的话展开成是这样的:
if(temp)
if(i) dosomething();
else
doanotherthing();
这样的话问题就出现了,else与第二句匹配了。
这样的宏定义是有测效的,上面的那种用空循环的方法是种解决的途径。
因为一般的编译器对这种无用的循环都进行优化。
个人觉得如果我们在if(condition)dosomething();外面加上花括号的话是不是能够得到同样的效果。
相关文章推荐
- 一个问题引发对Linux swap和内存的思考
- 一个iOS bug引发的思考
- 一个简单算法题引发的思考<DNA sorting>(about cin/template/new etc)
- 一个数据交换函数引发的思考
- 由一个小程序引发对 size_type类型的思考
- 一个JAVA题引发的思考
- Vert.x,一个异步、可伸缩、并发应用框架引发的思考
- 一个面试题引发的思考(Java的值传递)
- 一个简单的问题引发的思考
- 沫沫金::一个小问题引发的大思考
- 一个 Bug 引发的思考(超赞的文章)
- 一个异常引发的对Hashtable和HashMap的思考
- 一个嵌入式初学者引发的思考(jesse谈自己的经验体会) 【转】
- 一个badmatch错误引发的思考
- BGP的一个经典试验引发的思考
- 一个关于发送topic引发的production issue问题的思考
- 一个不经意的问题引发的小思考
- 一个电风扇引发的思考
- Spring之LoadTimeWeaver——一个需求引发的思考---转
- 一个二级菜单引发的思考