在 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后面的代码块执行一次。
这样写的意义是什么?为什么不直接使用块,而一定要加上 do while 循环?
发现这个问题一搜一大堆哦,题主确定不是SF的托么,哈哈,开个玩笑
{}
更直观些。do while
循环中,则能用break
达到这个目的。goto
,有些公司不让用goto
。兼容
各种编译器。宏
展开的时候不会出错。如果直接放在花括号
里会出错的这篇文章很详细哦
do while(0) 还有个用的地方是在宏定义#define里
不加大括号的代码
加了大括号的代码
do while(0)的代码
块级作用域。避免 {} 块里面的变量名扩散到上层作用域中。好处是减少外层作用域中需要记忆的名字的数量,减少误用这些变量的可能性。
具体来说,这段代码中
pImage
就被限制在只能在这个块中使用,出了这个块就不能用了,避免程序员误用,也避免名字冲突。在 C++ / Java 等支持块级作用域的语言中常见。gcc 还支持只写大括号:
另外一种作用是这样的使用goto来统一错误处理,如:
如果配合do{}while(0)的话.会这样的
在宏里常用do-while, 比如
在代码里调用这个宏:
用do-while, 上面的宏调用可以看起来像"函数调用", 句尾可以有分号
因为
do{} while(0);
最后可以带分号, 并且利用大括号把语句括起来;加入不用do-while, 上面的宏就写成:
调用的时候一般人会这么用: