今天刚仔细看cocosx2d-x的实例代码,首先另外产生疑问的地方是,怎么那么多地方会有do...while(0),这个不是直接执行一次就结束吗?为什么会多此一举呢?作为开源项目,这样写肯定有它的妙用之处,所以上网搜集了一下,确实大有妙处!
1、消除goto语句或者说简化代码
先贴一段代码看到的源代码:
CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
这段代码里就有do...while(0)操作,里面有个宏定义
#define CC_BREAK_IF(cond) if(cond) break
实际上此代码就是执行一遍,但是从宏定义中可以看到,会有break发生,break是用在循环中,跳出循环的。
如果没有do...while(0),是不是宏定义CC_BREAK_IF需要重写?
CC_BREAK_IF(! scene);替换为:if(!scene) return NULL;
CC_BREAK_IF(! layer);替换为:if (!layer) return scene;
...
也可以用goto语句来实现,但是goto是非常危险的,上面的代码这可以很好的实现代码的简化!
一个好的实例,请参见http://www.cnblogs.com/flying_bat/archive/2008/01/18/1044693.html,这里不再贴一遍了!
2、在宏定义中的妙用
宏定义大家都很熟悉,用例子说话吧:
#define FOO(x) foo(x); bar(x)
if (condition)
FOO(x);
else // syntax error here
...
上代码中替换后,是不是有问题?
那下面加入括号:
#define FOO(x) { foo(x); bar(x); }
你可以如下写:
if (condition)
FOO(x)
else
..
上面的代码是不是让你感觉不舒服,好像就是少个";"?
那用下面的定义:
#define FOO(x) do { foo(x); bar(x); } while (0
下面调用:
if (condition)
FOO(x);
else
....
是不是很奇妙~
参考:
1、http://www.cnblogs.com/flying_bat/archive/2008/01/18/1044693.html
2、http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for