原帖地址: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)解決得比較好。