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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 之编程语法习惯之 do{...}while(0) 的用处

發布時間:2025/3/15 c/c++ 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 之编程语法习惯之 do{...}while(0) 的用处 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在學習第一門編程語言時,就已經介紹了順序分支、條件分支、循環分支。比如循環分支有for、while、do-while語句。在隨后的學校及工作中,如果手工循環一般使用for、while,很少使用do-while,感覺用處不大,但現在看來,do-while大有用途。

1. 幫助定義復雜的宏以避免錯誤

舉例來說,假設你需要定義這樣一個宏:

#define DOSOMETHING() foo1(); foo2();

這個宏的本意是,當調用DOSOMETHING()時,函數foo1()和foo2()都會被調用。但是如果你在調用的時候這么寫:

if(a>0)DOSOMETHING();

因為宏在預處理的時候會直接被展開,你實際上寫的代碼是這個樣子的:

if(a>0)foo1();foo2();

這就出現了問題,因為無論a是否大于0,foo2()都會被執行,導致程序出錯。

那么僅僅使用{}將foo1()和foo2()包起來行么?比如:

#define DOSOMETHING() { foo1(); foo2(); }

我們在寫代碼的時候都習慣在語句右面加上分號,如果在宏中使用{},代碼里就相當于這樣寫了:“{...};”,展開后就是這個樣子:

if(a>0) {foo1();foo2(); };

很明顯,這是一個語法錯誤(大括號后多了一個分號)。

在所有可能情況下,期望我們寫的多語句宏總能有正確的表現幾乎是不可能的。你不能讓宏表現的像函數一樣---在沒有do/while(0)的情況下。

如果我們使用do{...}while(0)來定義宏,即:

#define DOSOMETHING() \do{ \foo1();\foo2();\}while(0)\

這樣,宏被展開后,上面的調用語句才會保留初始的語義。do能確保大括號里的邏輯能被執行,而while(0)能確保該邏輯只被執行一次,就像沒有循環語句一樣。

總結:在Linux和其它代碼庫里的,很多宏實現都使用do/while(0)來包裹他們的邏輯,這樣不管在調用代碼中怎么使用分號和大括號,而該宏總能確保其行為是一致的。

我的心得,這是我最喜歡使用do-while的一處用法,如果你開發了一個庫、甚至就只是一個宏實現提供給別人使用,你不能確信所有人都會按照你的意圖正確使用該實現,有的使用者處處加大括號,也有的人認為你會處理的。因此你需要保證你的實現在各種使用場景下都是表現一致的。另外,就像Scott Meyers在Effective C++中談及的,讓接口容易被正確使用,而不易被誤用

2. 避免使用goto控制程序流

在一些函數中,我們可能需要在return語句之前做一些清理工作,比如釋放在函數開始處由malloc申請的內存空間,使用goto總是一種簡單的方法:

int foo() {somestruct *ptr = malloc(...);dosomething...;if(error)goto END;dosomething...;if(error)goto END;dosomething...; END:free(ptr);return 0; }

?

但由于goto不符合軟件工程的結構化,而且有可能使得代碼難懂,所以很多人都不倡導使用,這個時候我們可以使用do{...}while(0)來做同樣的事情:

int foo() {somestruct *ptr = malloc(...);do{dosomething...;if(error)break;dosomething...;if(error)break;dosomething...;}while(0);free(ptr);return 0; }

這里將函數主體部分使用do{...}while(0)包含起來,使用break來代替goto,后續的清理工作在while之后,現在既能達到同樣的效果,而且代碼的可讀性、可維護性都要比上面的goto代碼好的多了。

我的心得,這也是喜歡do-while的第二個用法,非常好。比如有個人認為這樣會導致很多變量要在do-while語句外面提前聲明(這是C++程序反對的一點,用時才聲明),也有人認為還有強大的RAII和智能指針神馬的,不怕內存問題。但是,在某些場景下,要是這些都不能用呢,比如C語言?比如沒有smart ptr?比如維護的是舊代碼?

3. 避免由宏引起的警告

內核中由于不同架構的限制,很多時候會用到空宏,。在編譯的時候,這些空宏會給出warning,為了避免這樣的warning,我們可以使用do{...}while(0)來定義空宏:

#define EMPTYMICRO do{}while(0)

好吧,這種情況我還沒有見到。?

4. 定義單一的函數塊來完成復雜的操作

如果你有一個復雜的函數,變量很多,而且你不想要增加新的函數,可以使用do{...}while(0),將你的代碼寫在里面,里面可以定義變量而不用考慮變量名會同函數之前或者之后的重復。


這種情況應該是指一個變量多處使用(但每處的意義還不同),我們可以在每個do-while中縮小作用域,比如:

int key; string value; int func() {int key = GetKey();string value = GetValue();dosomething for key,value;do{int key;string value;dosomething for this key,value;}while(0); }

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的C++ 之编程语法习惯之 do{...}while(0) 的用处的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 成人免费激情视频 | 国模视频一区 | 日韩丰满少妇 | 国产字幕侵犯亲女 | 亚洲永久免费观看 | 偷拍女澡堂一区二区三区 | 91成人在线观看国产 | 怨女1988国语版在线观看高清 | 亚洲免费片 | 蜜臀久久99精品久久久久久 | 激情六月天| 日韩爽片| 成人久久一区二区 | 老司机久久精品视频 | 国模私拍xvideos私拍 | 人妻在客厅被c的呻吟 | 亚洲av无码国产精品色午夜 | 日韩精品极品视频在线观看免费 | 相亲对象是问题学生动漫免费观看 | 精品国产制服丝袜高跟 | 成人黄色在线网站 | 啪啪啪一区二区 | 毛片a片免费观看 | 亚洲中文字幕无码av | 国内成人精品 | 亚洲一区视频在线播放 | 浓精喷进老师黑色丝袜在线观看 | 日韩视频一二三 | 亚洲第一页夜 | 日韩高清不卡在线 | 95视频在线 | 国产视频黄 | 俺也去在线视频 | 在线日本视频 | 日韩精品小视频 | 亚洲aaa级 | 精品人妻人人做人人爽 | 蜜桃香蕉视频 | 双女主黄文 | 日韩porn| 久久中文字幕在线 | 国产99对白在线播放 | 夜色视频在线观看 | 大尺度做爰呻吟舌吻网站 | 亚洲综合视频一区 | 美女屁股眼视频免费 | 午夜亚洲aⅴ无码高潮片苍井空 | 日韩免费高清一区二区 | 啪啪福利 | 美女福利视频一区 | 一级片美女| 国产伦精品一区三区精东 | 亚洲免费av在线 | 人操人人| 性欧美hd调教 | 亚洲激情网站 | 日韩亚洲精品在线 | 一级片欧美 | 天堂av8| 国产免费成人在线视频 | 色啦啦视频| 成人a在线观看 | 久久婷婷综合国产 | 在线视频二区 | 综合久久久久久久久久久 | 一道本在线视频 | 色综合天天综合网国产成人网 | 日本久久久久 | 欧美精品久久久久久久久老牛影院 | 中文字幕av网址 | 超碰人体| 国产67194| 久久国产二区 | 丁香婷婷在线观看 | 五月婷婷中文 | 日本黄色小说 | 欧美调教视频 | 欧美天天干| 国产亚洲片 | 第四色影音先锋 | 黄色三级av| 日韩视频免费观看高清 | 国产传媒国产传媒 | 黑人欧美一区二区三区 | 欧美理论在线 | 色婷av| 亚洲色成人www永久网站 | 国产精品偷伦视频免费看 | 午夜黄色大片 | 成人欧美精品 | 超碰男人| 波多野吉衣在线观看视频 | 亚洲视频久久久 | 91激情影院| 免费a网址 | 日韩Av无码精品 | 99嫩草| 超碰加勒比 | 日韩免费电影一区 |