当前位置:  技术问答>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)
...
这样有什么含义呢?
我看不出会产生什么效果

|
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

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 有在联想开天4600上成功安装redhat linux 7.3的兄弟么?
  • 【● LINUX下有没有消息或事件驱动?如何取得呢?谢谢各位兄弟!
  • 大连的linux兄弟进来。
  • 兄弟的LINUX练习问题,请帮忙,分数可以商量!
  • 兄弟,有没有办法在windows下备分linux啊
  • xp和linux9共存问题 兄弟门,急啊,快进来帮忙。
  • linux局域网内文件夹共享问题,各位兄弟帮忙看看,谢谢
  • 知识共享:从Linux到Solaris:概述和命令差异,学吧~,兄弟们!
  • 很急的需要做个演示,哪位兄弟有Linux发展历程有关的资料,多少共享一点点!
  • 想学习Linux得兄弟姐妹们注意了:俺有电脑转让400元。
  • 在 linux 使用Java 的兄弟请帮忙--还是中文问题???
  • 兄弟们,请帮帮忙吧,关于LINUX 的调度和时钟中断处理代码的分析!在线等待啊。。。:(
  • linux tftp-proxy 源代码谁有,有做过的吗,请给兄弟指点迷津,高分感谢
  • 做Linux管理的兄弟们,大家工资都能到多少?
  • 我想转到linux上做开发,请兄弟们推荐几本好书,并指一条明路
  • 有哪位兄弟用过FLTK库,我用来做嵌入式LINUX上界面程序。
  • 兄弟们,Linux Fedora10中,那个电源管理里面,关机按钮按下去还要等待30S才能关机,怎么修改这个时间?
  • 和位兄弟,你们装的linux都能运行gcc吗?
  • 很对不起LINUX版的兄弟。我犯了大错。已经辞去了斑竹的职务,向LINUX版的兄弟告个别。。。。。
  • 急!!请一位南京地区linux高手,有偿培训俺们几个兄弟搞web开发....
  • 各为兄弟,小弟落伍,不知哪有jbuilder 6 企业版下载,兄弟们帮忙!!!
  • 谢谢水园的兄弟(三)
  • jquery的父子兄弟节点查找示例代码
  • anubis 兄弟请你帮忙了
  • 对JAVA版的兄弟大声喊 “ 求EJB开发捷径 ~~~~~~~~~~~~!”
  • 哪位高手能替兄弟解释一下,Struts是怎么回事?
  • yankee(歪诗闲人)进来领分!!!你的回贴救了兄弟的命,
  • CSDN有搞BEA WEBLOGIC相关的兄弟吗?
  • 兄弟们,谁有freenet的源代码呀??
  • 希望兄弟问给指条明路(200分)
  • linuxnewer(夜猫子) 等兄弟接分1


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3