在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)的奇葩用法。但以上两点是我觉得最主要的。