do while(0)的妙用

在Cocos2d-x的源码中,经常会有do while(0)的使用,如:

        do
        {
            CCImage* pImage = new CCImage();
            CC_BREAK_IF(NULL == pImage);
            bRet = pImage->initWithString(text, (int)dimensions.width, (int)dimensions.height, eAlign, fontName, (int)fontSize);
            CC_BREAK_IF(!bRet);
            bRet = initWithImage(pImage);
            CC_SAFE_RELEASE(pImage);
        } while (0);

同时在很多宏定义中有有do while(0)的身影。但是仔细一想,为什么要使用do while(0)呢?在代码中使用do while(0)主要有两点好处。

第一:

            在初始化过程中失败了,我们就没必要继续执行下去了,这时候就可以break跳出去。如上面:CCImage *pImage = new CCImage() 中如果new 失败了,就不能再往下执行,这时候就可以break了。

           有的人说使用do while(0)可以避免使用goto语句,我认为跟这里的用法是一样的。

第二:

  在宏定义中避免宏展开出错,例子如下:

           

#define SAFE_FREE(p) do {free(p);p=NULL;} while(0)

如果不使用 do while(0),就变成:

#define SAFE_FREE(p) free(p);p=NULL;

调用的时候,如果使用

if(条件)
    SAFE_FREE(p);

宏展开后就是:

if(条件)
   free(p);
   p = NULL;

这时候 p = NULL就一定会执行了,与我们想要的不同。

网上还有很多do while(0)的奇葩用法。但以上两点是我觉得最主要的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值