C语言do...while语句的妙用(包裹宏替换多句代码)(代替go to语法)(隔绝外部变量)
文章目錄
- 使用do...while(0)的好處
- > 輔助定義復(fù)雜的宏,避免引用的時(shí)候出錯(cuò),提高代碼健壯性
- > 消除分支語(yǔ)句或者goto語(yǔ)句,提高代碼的易讀性
- > 使用代碼塊,代碼塊內(nèi)定義變量,不用考慮變量重復(fù)問(wèn)題
使用do…while(0)的好處
在C++中,do…while 通常是用來(lái)做循環(huán)用的,然而我們做循環(huán)操作可能用for和while要多一些。經(jīng)常看到一些開(kāi)源代碼會(huì)出現(xiàn)do…while(0)這樣的代碼,這樣的代碼看上去肯定不是用來(lái)做循環(huán)的,那為什么要這樣用呢?
實(shí)際上do…while(0)的作用遠(yuǎn)大于美化代碼,現(xiàn)總結(jié)起來(lái)主要有以下幾個(gè)作用:
> 輔助定義復(fù)雜的宏,避免引用的時(shí)候出錯(cuò),提高代碼健壯性
假設(shè)你需要定義一個(gè)這樣的宏:
#define DOSOMETHING()\ func1();\func2();這個(gè)宏的本意是,當(dāng)調(diào)用DOSOMETHING()時(shí),函數(shù)func1()和func2()都會(huì)被調(diào)用。但是如果你在調(diào)用的時(shí)候這么寫(xiě):
if(a>0)DOSOMETHING();因?yàn)楹暝陬A(yù)處理的時(shí)候會(huì)直接被展開(kāi),你實(shí)際上寫(xiě)的代碼是這個(gè)樣子的:
if(a>0)func1();func2();這就出現(xiàn)了問(wèn)題,因?yàn)闊o(wú)論a是否大于0,func2()都會(huì)被執(zhí)行,導(dǎo)致程序出錯(cuò)。
那么僅僅使用{}將func1()和func2()包起來(lái)行么?
我們?cè)趯?xiě)代碼的時(shí)候都習(xí)慣在語(yǔ)句右面加上分號(hào),如果在宏中使用{},代碼里就相當(dāng)于這樣寫(xiě)了:“{…};”,假如有以下代碼:
#define DOSOMETHING(){\ func1();\func2();} ... if(a>0)DOSOMETHING(); else... ...展開(kāi)后就是這個(gè)樣子:
if(a>0) {func1();func2(); }; else...這樣是不會(huì)編譯通過(guò)。所以,很多人才采用了do{…}while(0);
#define DOSOMETHING() \ do{ \func1();\func2();\}while(0)\... if(a>0)DOSOMETHING(); else... ...> 消除分支語(yǔ)句或者goto語(yǔ)句,提高代碼的易讀性
如果在一個(gè)函數(shù)中開(kāi)始要分配一些資源,然后在中途執(zhí)行過(guò)程中如果遇到錯(cuò)誤則退出函數(shù),當(dāng)然,退出前先釋放資源,我們的代碼可能是這樣:
bool Execute() {// 分配資源int *p = new int;bool bOk(true);// 執(zhí)行并進(jìn)行錯(cuò)誤處理bOk = func1();if(!bOk) {delete p; p = NULL;return false;}bOk = func2();if(!bOk) {delete p; p = NULL;return false;}bOk = func3();if(!bOk) {delete p; p = NULL;return false;}// ..........// 執(zhí)行成功,釋放資源并返回delete p; p = NULL;return true;}這里一個(gè)最大的問(wèn)題就是代碼的冗余,而且我每增加一個(gè)操作,就需要做相應(yīng)的錯(cuò)誤處理,非常不靈活。于是我們想到了goto:
bool Execute() {// 分配資源int *p = new int;bool bOk(true);// 執(zhí)行并進(jìn)行錯(cuò)誤處理bOk = func1();if(!bOk) goto errorhandle;bOk = func2();if(!bOk) goto errorhandle;bOk = func3();if(!bOk) goto errorhandle;// ..........// 執(zhí)行成功,釋放資源并返回delete p; p = NULL;return true;errorhandle:delete p; p = NULL;return false;}代碼冗余是消除了,但是我們引入了C++中身份比較微妙的goto語(yǔ)句,雖然正確的使用goto可以大大提高程序的靈活性與簡(jiǎn)潔性,但太靈活的東西往往是很危險(xiǎn)的,它會(huì)讓我們的程序捉摸不定,那么怎么才能避免使用goto語(yǔ)句,又能消除代碼冗余呢,請(qǐng)看do…while(0)循環(huán):
bool Execute() {// 分配資源int *p = new int;bool bOk(true);do{// 執(zhí)行并進(jìn)行錯(cuò)誤處理bOk = func1();if(!bOk) break;bOk = func2();if(!bOk) break;bOk = func3();if(!bOk) break;// ..........}while(0);// 釋放資源delete p; p = NULL;return bOk;}> 使用代碼塊,代碼塊內(nèi)定義變量,不用考慮變量重復(fù)問(wèn)題
當(dāng)你的功能很復(fù)雜,變量很多你又不愿意增加一個(gè)函數(shù)的時(shí)候,使用do{}while(0);,將你的代碼寫(xiě)在里面,里面可以定義變量而不用考慮變量名會(huì)同函數(shù)之前或者之后的重復(fù)。
參考文章:使用do…while(0)的好處
總結(jié)
以上是生活随笔為你收集整理的C语言do...while语句的妙用(包裹宏替换多句代码)(代替go to语法)(隔绝外部变量)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ftp上传文件报错:ftp recv:
- 下一篇: 怎么判断程序运行的当前目录在哪?关键词: