zoukankan      html  css  js  c++  java
  • 为什么使用do{}while(0)?

    近期学习Cocos2d-x,看到不少使用do{}while(0)的宏定义,如:

    #define CC_SAFE_DELETE(p)           do { delete (p); (p) = nullptr; } while(0)

    这里使用do{}while(0)来确保语句块被运行一次,那么,能不能使用别的语法结构。完毕这种工作呢?


    1、直接使用{}语句块

    #define CC_SAFE_DELETE(p)           { delete (p); (p) = nullptr; }

    使用以下的代码:

    if(p)
        CC_SAFE_DELETE(p);
    else
        ...

    编译器会报错。由于代码实际上被替换为了

    if(p)
        { delete (p); (p) = nullptr; }
    ;
    else
        ...

    注意这里的";"是另外的一行。第一个if语句是没有else子句的。接下来是一个空语句,然后是else,这个else没有相应的if语句。编译器报错。

    使用if语句的时候,有一个须要注意的地方:即使是单行语句,也要使用{}括起来,以后维护代码的时候。不会由于在单行语句前面加入了某些代码,导致此单行语句溢出if控制块。

    当然,假设直接使用CC_SAFE_DELETE宏,不在宏后面加入分号,能够解决问题:

    if(p)
        CC_SAFE_DELETE(p)
    else
        ...

    可是。作为一名C++程序猿,差点儿会本能的在语句最后面加入上";"


    2、使用if(1)语句块

     #define CC_SAFE_DELETE(p)           if(1) { delete (p); (p) = nullptr; } else {}

    这样,显得代码比較臃肿。

    注意。后面的else是不能省略掉的,否则,在if-else嵌套语句时。也会出现故障。


    这里须要注意的是。do{}while()语句须要加入";"。

    使用do{}while(0),可以让开发人员可以以最小的代价来使用库,库作者不须要对开发人员有更高的编码要求。提高库代码的健壮性。




  • 相关阅读:
    统计图配色方案_填充
    如何在C/S下打印报表
    如何利用API导出带有页眉页脚的excel
    通过ajax记录打印信息
    reportConfig.xml两种数据源连接的配置方式
    润乾填报页面导入excel后增加js动作
    matplotlib多plot可视化
    Python之SGDRegressor
    Python之岭回归
    Python之随机梯度下降
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6849274.html
Copyright © 2011-2022 走看看