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{}这中方式。

  • 相关阅读:
    SQL 联合语句
    Strust2MVC
    struts2执行流程
    struts2的验证框架
    poj 1201 Intervals
    FZOJ Problem 2219 StarCraft
    poj 3470 Walls
    hdu 6021 MG loves string
    FZOJ Problem 2150 Fire Game
    FZOJ Problem 2148 Moon Game
  • 原文地址:https://www.cnblogs.com/zouly/p/3828759.html
Copyright © 2011-2022 走看看