为什么要用do{ }while(0)

【gq414047080】:

_Api()
{
     do
     {
         //do something
     }while(0);
}

 

这样的写法有什么好处啊?

将楼主的问题扩展一下,do{} while(0);的用处都有什么?不仅限于楼主所贴代码的使用形式。这里整理一些(我觉得)比较有意义的回帖:

【happynesslele】:有时候只是为了代码分块,比仅仅使用{}更直观些。

 

bool CCLayer::init()
{
bool bRet = false;

    do 
    {        
        CCDirector * pDirector;
        CC_BREAK_IF(!(pDirector = CCDirector::sharedDirector()));
        this->setContentSize(pDirector->getWinSize());
        m_bTouchEnabled = false;
        m_bAccelerometerEnabled = false;
        // success
        bRet = true;
} while(0);

    return bRet;
}

 

【mujiok2003】:变形的goto,有些公司不让用goto。

 

// goto case
{
  if(!a) goto done;
  //do something here
  if(!b) goto done;
  //do another thing here
  done:
   //final step goes here
}

// do ... while(0)
{
  do
  {
    if(!a) break;
    //do something here
    if(!b) break;
    //do another thing here   
  }while(0);
  //final step goes here
}

 

【falcomavin】:当你执行一段代码到一半,想跳过剩下的一半的时候,如果你正处于do while循环中,则能用break达到这个目的。如:

 

do
{
  我执行.
  我执行..
  我再执行…
  if (有什么条件满足了我)
  {
    呀,我想跳到另外一段代码了,剩下的不执行了,可是不建议用goto语句,怎么办呢?
     break;/*看我的*/
  }
  我有可能被执行.
  我有可能被执行..
  我有可能被执行…
}while(false)

 

【smartdota】:这样做也可以是兼容各种编译器。

int a;
a = 10;
int b;
b = 20;

这种代码在只支持c89的编译器上是编译不过去的,比如ADS 2.0。

 

int a;
a = 10;
do
{
   int b;
   b = 20;
}while(0);

 

这种代码在各种编译器上都能编译过去。

【yangwenjun2017】:为了宏展开的时候不会出错。如果直接放在花括号离会出错的,比如:

#define DO_SOMETHING {int time = 100 ;make_love(i);}

下面是使用的地方:

if(you->strong())DO_SOMETHING;
else ..;

展开后是这样的:

if(you->strong())
{int time = 100 ;make_love(i);}
;
else ..;

那么编译就会出错,可以验证使用d0{}while(0)就不会出错,linux内核源码经常见这玩意。

【zhaokai115】:假如a, b分别是两条c语句,定义一个顺序执行他们的宏有几种写法,比如:

#define AB1    a; b;     // x, 下面语句b不能被执行: if (cond) AB1;
#define AB2    { a; b; }  // x, 下面语句编译出错:if (cond) AB2; else ...;
#define AB3    a, b      // x, 有运算符优先级问题
#define AB4    do { a; b; } while (0)

前面几个都是有问题的,只有do while(0)解决得比较好。


转载于:https://my.oschina.net/u/2472134/blog/523743

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值