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),可以让开发人员可以以最小的代价来使用库,库作者不须要对开发人员有更高的编码要求。提高库代码的健壮性。




  • 相关阅读:
    java泛型
    转载:MSIL Instruction Table
    What if your dynamic sql statement is too long?
    自己第一个正儿八经的div+css页面
    bulk insert formatFile格式记录
    日志 20071221(WCF,using keyword)
    C++点滴
    The scripts used to generate a demo "School" database (with data)
    The typical scenarios of using "Insert" in Tsql
    如何生成任意给定区间的随机值序列
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6849274.html
Copyright © 2011-2022 走看看