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