大牛深入浅出讲解c语言do{...}while(0)功能及用法
當(dāng)?shù)谝淮斡龅絛o{…}while(0),我是懵的,這是什么操作,為了好看嗎?后來發(fā)現(xiàn)Linux內(nèi)核中隨處可見啊,大神們這樣的操作肯定是有道理的。查詢了一些資料,做一下總結(jié)。在今后C語(yǔ)言開發(fā)中,你也可以放心使用這一技巧。
1
配合定義復(fù)雜的宏
舉個(gè)例子,假設(shè)你定義了一個(gè)宏:
1#define?DOSOMETHING()?fuc1();?fuc2();當(dāng)調(diào)用DOSOMETHING()的時(shí)候,你希望調(diào)用fuc1()和fuc2()來做一些事情。但是當(dāng)在if語(yǔ)句中調(diào)用時(shí),可能會(huì)這么寫:
1if(num?>?0) 2????DOSOMETHING();預(yù)處理展開宏,替換文本如下:
1if(num?>?0) 2????fuc1(); 3fuc2();這樣就出現(xiàn)了問題,fuc2()就不受if語(yǔ)句的控制了,導(dǎo)致程序出錯(cuò)。
可能你會(huì)說,宏定義建議把整個(gè)表達(dá)式用大括號(hào)括起來的:
1#define?DOSOMETHING()?{fuc1();?fuc2();}還是if語(yǔ)句來調(diào)用:
1if(num?>?0) 2????DOSOMETHING(); 3else 4????printf("num<0\r\n");這樣程序編譯會(huì)報(bào)錯(cuò):
我們查看預(yù)處理文件,宏展開是這樣子的:
if語(yǔ)句被后面的分號(hào)提前結(jié)束,else無(wú)法與其匹配。而使用do{…}while(0)后就不會(huì)出錯(cuò)了,Linux內(nèi)核中的宏定義很多都是這么用的:
2
避免定義空的宏時(shí)引起warning
一些大型的C工程中,為了兼容不同的架構(gòu),或者為了移植方便,都會(huì)用到空的宏定義。在編譯的時(shí)候,編譯器會(huì)給出警告,為了避免這些warning,我們可以使用do{…}while(0)來定義空的宏:
3
避免goto語(yǔ)句
在一些函數(shù)中,我們可能需要在return語(yǔ)句之前做一些清理工作,很多人不提倡用goto語(yǔ)句。好吧,do{…}while(0)可以實(shí)現(xiàn)同樣的功能:
代碼可讀性和可維護(hù)性要比goto語(yǔ)句好多了。
4
定義單一的函數(shù)塊
當(dāng)你的功能復(fù)雜,變量很多又不愿增加一個(gè)函數(shù)的時(shí)候,可以將你的代碼用do{…}while(0)包裹,在里面可以定義變量而不用考慮變量名會(huì)同函數(shù)前后重復(fù)。當(dāng)然,為了后續(xù)維護(hù)方便,不建議這么做。
5
就是感覺美觀好看
對(duì),就是覺得好看,不解釋:
你點(diǎn)的每個(gè)贊,我都當(dāng)成喜歡
總結(jié)
以上是生活随笔為你收集整理的大牛深入浅出讲解c语言do{...}while(0)功能及用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美丽的童话故事都是从城堡开始...
- 下一篇: 【S操作】冰箱正常运行监控系统需求整理