zoukankan      html  css  js  c++  java
  • do { ....} while(0) 在宏里冗余的意义

    cocos2d-x提供了许多宏模板,如:CC_SAFE_RETAIN(p),CC_SAFE_DELETE(p) 等等

    查看一下CC_SAFE_RETAIN的源码:

    #define CC_SAFE_RETAIN(p)            do { if(p) { (p)->retain(); } } while(0)

    为什么要使用 do{}while(0)语句,它不是只执行一次吗?,为何看的这么令人费解呢?,它与直接使用if(){}语句有什么不同?

    假设这里去掉do...while(0),

    #define SAFE_DELETE(p) delete p; p = NULL;

    那么以下代码:

    if(NULL != p) SAFE_DELETE(p)

    存在问题:无论if判断是否通过,p=NULL;这句都能执行。

    你可能发现,为了避免这两个问题,我不一定要用这个令人费解的do...while,  我直接用{}括起来就可以了 

    #define SAFE_DELETE(p) { delete p; p = NULL;}

    的确,这样的话上面的问题是不存在了,但是我想对于C++程序员来讲,在每个语句后面加分号是一种约定俗成的习惯,这样的话,以下代码: 

    if(NULL != p) SAFE_DELETE(p);
    else   ...

    因为if(exp){};else... 这连编译都通不过。

    所以采用do...while(0)是做好的选择了,对于一个library的作者,他所要做的就是让其库具有通用性,我们不能指望所有人都习惯性的都写成if(){}else{}这中方式。

  • 相关阅读:
    shell脚本学习001
    Discuz 代码分析 001 forum.php
    Oauth2.0 入门
    第一篇文章
    position的四个属性值: relative ,absolute ,fixed,static
    JQuery中stop([clearQueue],[goToEnd])介绍
    <meta>
    sublime 2中Package control安装和使用
    ios 状态码
    <video>和<audio>标签,对视频和音频的支持
  • 原文地址:https://www.cnblogs.com/zouly/p/3828759.html
Copyright © 2011-2022 走看看