使用do{ } while(0);有什么好處?


原帖地址:http://bbs.csdn.net/topics/390361821?page=1#post-393624278

【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)解決得比較好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM