当前位置:  技术问答>linux和unix

do{}while(0)的意义

    来源: 互联网  发布时间:2015-07-02

    本文导语:  一直以为Linux里面,那些do{}while(0)只是为了程序的源代码看起来比较好看而已 今天听说他是有特殊作用的,在线请教,是什么作用? | 楼说的不是很全面,我给个例子吧 #define wait_event(wq,condi...

一直以为Linux里面,那些do{}while(0)只是为了程序的源代码看起来比较好看而已
今天听说他是有特殊作用的,在线请教,是什么作用?

|
楼说的不是很全面,我给个例子吧

#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)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。

|
是为了解决使用宏的时候烦人的分号问题。

|
可是直接用{}括起来的话,最后的分号会引起麻烦的

|
但这样就一定要在最后加分号,不能当作表达式用了。
唉,还是尽量避免用宏替换的方法,太容易出现问题了。

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












  • 相关文章推荐
  • Linux 下c++开发error while loading shared libraries问题解决
  • 用while循环等待事件发生时是否可以释放系统资源
  • for(iter.hasNext()){....}用法与while有什么区别?
  • 消息队列一般是怎么使用的,是采用While的方式进行轮询么
  • shell 的 while无限循环问题!
  • shell脚本中while不能嵌套?
  • error while loading shared libraries:libncurses.so.4
  • 请教一个基础问题while循环怎么从10到0来循环10次?
  • 新手请教:while read中末尾的重定向表示什么意思?
  • proc时错误:error while loading shared libraries.....
  • Bash 中的while 语句
  • 关于shell中的while循环的使用,求助
  • shell 脚本 while循环结构问题,急ing,,,,,,
  • shell编程中while的问题,高分
  • error while loading shared libraries:在线等
  • 请问为什么这样的两个while循环却有不同的效果
  • 简单的shell脚本 关于while循环
  • MySQL与MSSQl使用While语句循环生成测试数据的代码
  • cygwin——error while loading shared libraries:?
  • for( ; ; ) 与 while( 1 ) ?
  • while和for可以相互转换的例子分享


  • 站内导航:


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

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

    浙ICP备11055608号-3