近期学习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),可以让开发人员可以以最小的代价来使用库,库作者不须要对开发人员有更高的编码要求。提高库代码的健壮性。
时间: 2024-10-07 09:39:12