日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/4/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大牛深入浅出讲解c语言do{...}while(0)功能及用法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(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)同樣的功能:

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}

代碼可讀性和可維護(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。