c++中do...while(0)的作用

      今天刚仔细看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

你可能感兴趣的:(cocos2d-x)