日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

大牛深入浅出讲解c语言do{...}while(0)功能及用法

發布時間:2025/4/5 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大牛深入浅出讲解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)可以實現同樣的功能:

1int?foo()2{3????somestruct?*ptr?=?malloc(...);4????do5????{6????????dosomething...;7????????if(error)8????????????break;9????????dosomething...; 10????????if(error) 11????????????break; 12????????dosomething...; 13????} 14????while(0); 15 16????free(ptr); 17????return?0; 18}

代碼可讀性和可維護性要比goto語句好多了。

4

定義單一的函數塊

當你的功能復雜,變量很多又不愿增加一個函數的時候,可以將你的代碼用do{…}while(0)包裹,在里面可以定義變量而不用考慮變量名會同函數前后重復。當然,為了后續維護方便,不建議這么做。

5

就是感覺美觀好看

對,就是覺得好看,不解釋:

你點的每個贊,我都當成喜歡

總結

以上是生活随笔為你收集整理的大牛深入浅出讲解c语言do{...}while(0)功能及用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。