資源描述:
《#define do{} while(0) 用法妙用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、#definedo{}while(0)用法妙用2010-12-1011:44#definedo{}while(0)什么意思#definedo{}while(0)為什么這么用什么情況下用宏定義do{}while(0);簡(jiǎn)單地說(shuō),就是能夠?qū)崿F(xiàn)復(fù)雜的定義,通用性強(qiáng),任何情況下都適用。#defineMACRO_NAME(para)do{macrocontent}while(0)的格式,總結(jié)了以下幾個(gè)原因:1,空的宏定義避免warning:#definefoo()do{}while(0)2,存在一個(gè)獨(dú)立的block,可以用
2、來(lái)進(jìn)行變量定義,進(jìn)行比較復(fù)雜的實(shí)現(xiàn)。3,如果出現(xiàn)在判斷語(yǔ)句過(guò)后的宏,這樣可以保證作為一個(gè)整體來(lái)是實(shí)現(xiàn):#definefoo(x)action1();action2();在以下情況下:if(NULL==pPointer)foo();就會(huì)出現(xiàn)action1和action2不會(huì)同時(shí)被執(zhí)行的情況,而這顯然不是程序設(shè)計(jì)的目的。4,以上的第3種情況用單獨(dú)的{}也可以實(shí)現(xiàn),但是為什么一定要一個(gè)do{}while(0)呢,看以下代碼:#defineswitch(x,y){inttmp;tmp="x";x=y;y=tmp;}i
3、f(x>y)switch(x,y);else//error,parseerrorbeforeelseotheraction();在把宏引入代碼中,會(huì)多出一個(gè)分號(hào),從而會(huì)報(bào)錯(cuò)。//------------------------------------------------使用do{….}while(0)把它包裹起來(lái),成為一個(gè)獨(dú)立的語(yǔ)法單元,從而不會(huì)與上下文發(fā)生混淆。同時(shí)因?yàn)榻^大多數(shù)的編譯器都能夠識(shí)別do{…}while(0)這種無(wú)用的循環(huán)并進(jìn)行優(yōu)化,所以使用這種方法也不會(huì)導(dǎo)致程序的性能降低。詳解如下:MFC,在
4、MFC的afx.h文件里面,你會(huì)發(fā)現(xiàn)很多宏定義都是用了do...while(0)或do...while(false),比如說(shuō):#defineAFXASSUME(cond)do{bool__afx_condVal=!!(cond);ASSERT(__afx_condVal);__analysis_assume(__afx_condVal);}while(0)粗看我們就會(huì)覺(jué)得很奇怪,既然循環(huán)里面只執(zhí)行了一次,我要這個(gè)看似多余的do...while(0)有什么意義呢?當(dāng)然有!為了看起來(lái)更清晰,這里用一個(gè)簡(jiǎn)單點(diǎn)的宏來(lái)演示
5、:#defineSAFE_DELETE(p)do{deletep;p=NULL}while(0)假設(shè)這里去掉do...while(0),#defineSAFE_DELETE(p)deletep;p=NULL;那么以下代碼:if(NULL!=p)SAFE_DELETE(p)else...dosth...就有兩個(gè)問(wèn)題,1)因?yàn)閕f分支后有兩個(gè)語(yǔ)句,else分支沒(méi)有對(duì)應(yīng)的if,編譯失敗2)假設(shè)沒(méi)有else,SAFE_DELETE中的第二個(gè)語(yǔ)句無(wú)論if測(cè)試是否通過(guò),會(huì)永遠(yuǎn)執(zhí)行。你可能發(fā)現(xiàn),為了避免這兩個(gè)問(wèn)題,我不一定要用
6、這個(gè)令人費(fèi)解的do...while,我直接用{}括起來(lái)就可以了#defineSAFE_DELETE(p){deletep;p=NULL;}的確,這樣的話上面的問(wèn)題是不存在了,但是我想對(duì)于C++程序員來(lái)講,在每個(gè)語(yǔ)句后面加分號(hào)是一種約定俗成的習(xí)慣,這樣的話,以下代碼:if(NULL!=p)SAFE_DELETE(p);else...dosth...其else分支就無(wú)法通過(guò)編譯了(原因同上),所以采用do...while(0)是做好的選擇了。也許你會(huì)說(shuō),我們代碼的習(xí)慣是在每個(gè)判斷后面加上{},就不會(huì)有這種問(wèn)題了,也就
7、不需要do...while了,如:if(...){}else{}誠(chéng)然,這是一個(gè)好的,應(yīng)該提倡的編程習(xí)慣,但一般這樣的宏都是作為library的一部分出現(xiàn)的,而對(duì)于一個(gè)library的作者,他所要做的就是讓其庫(kù)具有通用性,強(qiáng)壯性,因此他不能有任何對(duì)庫(kù)的使用者的假設(shè),如其編碼規(guī)范,技術(shù)水平等do...while(0)-妙用(轉(zhuǎn)...)sswanglei發(fā)表于2007-7-122:33:00在C++中,有三種類(lèi)型的循環(huán)語(yǔ)句:for,while,和do...while,但是在一般應(yīng)用中作循環(huán)時(shí),我們可能用for和whil
8、e要多一些,do...while相對(duì)不受重視。但是,最近在讀我們項(xiàng)目的代碼時(shí),卻發(fā)現(xiàn)了do...while的一些十分聰明的用法,不是用來(lái)做循環(huán),而是用作其他來(lái)提高代碼的健壯性。1.do...while(0)消除goto語(yǔ)句。通常,如果在一個(gè)函數(shù)中開(kāi)始要分配一些資源,然后在中途執(zhí)行過(guò)程中如果遇到錯(cuò)誤則退出函數(shù),當(dāng)然,退出前先釋放資源,我們的代碼可能是這樣:version1b