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