为什么使用do{}while(0)?

来源:互联网 发布:linux 的办公软件 编辑:程序博客网 时间:2024/04/26 18:00

最近学习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
原创粉丝点击