当前位置: 技术问答>linux和unix
哪位兄弟能告诉我linux里面的do{}while(0)的含义么?
来源: 互联网 发布时间:2015-09-06
本文导语: read_lock() do{}while(0) read_unlock() do{}while(0) ... 这样有什么含义呢? 我看不出会产生什么效果 | do{ }while(0)主要是用于定义宏, 好像是为了防止在于处理之后{}内的语句产生错误 如果没有这...
read_lock() do{}while(0)
read_unlock() do{}while(0)
...
这样有什么含义呢?
我看不出会产生什么效果
read_unlock() do{}while(0)
...
这样有什么含义呢?
我看不出会产生什么效果
|
do{ }while(0)主要是用于定义宏, 好像是为了防止在于处理之后{}内的语句产生错误
如果没有这个do{}while(0) ,很容易出错
例如
http://www.zdnet.com.cn/developer/code/story/0,2000081534,39039052-2,00.htm
--------------------------------------------------------------------------------
在刚开始阅读LINUX的时候有一个小小的宏让我百思不得其解:
#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)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。
如果没有这个do{}while(0) ,很容易出错
例如
http://www.zdnet.com.cn/developer/code/story/0,2000081534,39039052-2,00.htm
--------------------------------------------------------------------------------
在刚开始阅读LINUX的时候有一个小小的宏让我百思不得其解:
#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)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。
|
就是为了用宏来实现一个函数的功能。一般对于自旋锁(spinlock)的问题,用的比较多。当机器只有一个cpu时,所是没有意义的所以定义成do{}while(0)。
例如:
#ifdef CONFIG_SMP
read_lock(int lock){
.......
}
read_unlock(int lock){
........
}
#else
#define read_lock(lock) (void)(lock) /* Not "unused variable". */
#define read_unlock(lock) do { } while(0)
#endif
例如:
#ifdef CONFIG_SMP
read_lock(int lock){
.......
}
read_unlock(int lock){
........
}
#else
#define read_lock(lock) (void)(lock) /* Not "unused variable". */
#define read_unlock(lock) do { } while(0)
#endif
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。