cocos2d-x提供了许多宏模板,如:CC_SAFE_RETAIN(p),CC_SAFE_DELETE(p) 等等
查看一下CC_SAFE_RETAIN的源码:
#define CC_SAFE_RETAIN(p) do { if(p) { (p)->retain(); } } while(0)
为什么要使用 do{}while(0)语句,它不是只执行一次吗?,为何看的这么令人费解呢?,它与直接使用if(){}语句有什么不同?
假设这里去掉do...while(0),
#define SAFE_DELETE(p) delete p; p = NULL;
那么以下代码:
if(NULL != p) SAFE_DELETE(p)
存在问题:无论if判断是否通过,p=NULL;这句都能执行。
你可能发现,为了避免这两个问题,我不一定要用这个令人费解的do...while, 我直接用{}括起来就可以了
#define SAFE_DELETE(p) { delete p; p = NULL;}
的确,这样的话上面的问题是不存在了,但是我想对于C++程序员来讲,在每个语句后面加分号是一种约定俗成的习惯,这样的话,以下代码:
if(NULL != p) SAFE_DELETE(p); else ...
因为if(exp){};else... 这连编译都通不过。
所以采用do...while(0)是做好的选择了,对于一个library的作者,他所要做的就是让其库具有通用性,我们不能指望所有人都习惯性的都写成if(){}else{}这中方式。