当前位置:编程学习 > C/C++ >>

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

     今天刚仔细看cocosx2d-x的实例代码,首先另外产生疑问的地方是,怎么那么多地方会有do...while(0),这个不是直接执行一次就结束吗?为什么会多此一举呢?作为开源项目,这样写肯定有它的妙用之处,所以上网搜集了一下,确实大有妙处!
 
1、消除goto语句或者说简化代码    
   先贴一段代码看到的源代码:
 
  
 
[cpp]  
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)操作,里面有个宏定义
[cpp]  
#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、在宏定义中的妙用
 
宏定义大家都很熟悉,用例子说话吧:
[cpp]  
#define FOO(x) foo(x); bar(x)  
  
if (condition)  
    FOO(x);  
else // syntax error here  
    ...  
上代码中替换后,是不是有问题?
 
那下面加入括号:
[cpp]  
#define FOO(x) { foo(x); bar(x); }  
你可以如下写:
[cpp]  
if (condition)  
    FOO(x)  
else  
    ..  
上面的代码是不是让你感觉不舒服,好像就是少个";"?
 
那用下面的定义:
[cpp] 
#define FOO(x) do { foo(x); bar(x); } while (0  
下面调用:
[cpp] 
if (condition)  
    FOO(x);  
else  
    ....  
是不是很奇妙~
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,