慵懒的猫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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{}这中方式。

 

 

 

 

 

posted on 2014-07-06 22:43  慵懒的猫  阅读(316)  评论(0编辑  收藏  举报