合理或违规
從一些經(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ò)誤了。
要是使用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í)慣吧
今天總算看到了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é)
- 上一篇: 找到一个全能的免费空间!支持SQL和.n
- 下一篇: 突然让我想起了以前的面试(转http:/