为什么使用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),能够让开发者能够以最小的代价来使用库,库作者不需要对开发者有更高的编码要求,提高库代码的健壮性。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值