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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

合理或违规

發(fā)布時(shí)間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 合理或违规 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
從一些經(jīng)典代碼中常常看到宏中使用do...while(0)的用法,感覺(jué)上do...while(0)只是在有可能要中途跳出后續(xù)一段代碼的時(shí)候替換goto的一種用法,其他的就不求甚解了。

今天總算看到了wiki上對(duì)do...while(0)的解釋,算是解了心中的一個(gè)疑惑。

一種情況是,這種用法可以避免在if/for下使用宏時(shí),由于宏中的多個(gè)語(yǔ)句遺漏大括號(hào)而造成流程錯(cuò)誤。就像下面這一段代碼,可算是個(gè)明顯的錯(cuò)誤了。


? #define?DO_SOMETHING()??DO_A();\
??? ????DO_B();??\
??? ????DO_C()
???
//

??? if?(CONDITION_A)
??? ????DO_SOMETHING();


要是使用do...while(0)DO_SOMETHING()宏改成這樣,就可以避免上述的錯(cuò)誤了。

#define?DO_SOMETHING()?do{?\
??? ????DO_A();?\
??? ????DO_B();?\
??? ????DO_C();?\
??? }
while(0)
這可就有一個(gè)疑問(wèn)了,何必加上do...while(0)呢,直接使用大括號(hào)不就好了么?

不錯(cuò),只要在宏中使用大括號(hào)就可以把多條語(yǔ)句合成一條語(yǔ)句了。不過(guò),大括號(hào)并不是個(gè)天山雪蓮般可治百病的靈藥喲。

看看直接使用大括號(hào)的程序吧。

#define?DO_SOMETHING()?{\
??? ????DO_A();??\
??? ????DO_B();??\
??? ????DO_C();??\
??? }

???
//

???
if?(CONDITION_A())
??? ????DO_SOMETHING();
???
else
??? ????DO_SOMETHING_ELSE();

看出問(wèn)題了么?由于if語(yǔ)句下的宏后多的那個(gè)小小的分號(hào),if下的一個(gè)語(yǔ)句就變成了兩個(gè)語(yǔ)句,隨后的else可就會(huì)提示你語(yǔ)法錯(cuò)誤嘍

而使用之前do...while(0)的宏就不會(huì)有這個(gè)問(wèn)題,這也就是do...while(0)的第二個(gè)用處了。

當(dāng)然,以上說(shuō)的這些都是一種無(wú)奈的保護(hù)機(jī)制。如果保持一個(gè)良好的編程習(xí)慣,比如在if和else后面緊跟大括號(hào),就不需要在乎宏上的do...while(0)了。

只是,可惜的是,當(dāng)我把do...while(0)使用到公司的代碼中時(shí),卻發(fā)現(xiàn)這觸犯了Lint工具的檢測(cè)規(guī)范,而直接給了我違規(guī)的結(jié)論。無(wú)奈之下,只得把do...while(0)全部刪除。

或許,Lint工具并不是告訴我這樣做違反編程規(guī)范,只是想提醒我要養(yǎng)成良好的遵守編程習(xí)慣吧

轉(zhuǎn)載于:https://www.cnblogs.com/Gigabyte/archive/2007/01/18/623263.html

總結(jié)

以上是生活随笔為你收集整理的合理或违规的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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