合理或违规
從一些經典代碼中常常看到宏中使用do...while(0)的用法,感覺上do...while(0)只是在有可能要中途跳出后續一段代碼的時候替換goto的一種用法,其他的就不求甚解了。
今天總算看到了wiki上對do...while(0)的解釋,算是解了心中的一個疑惑。
一種情況是,這種用法可以避免在if/for下使用宏時,由于宏中的多個語句遺漏大括號而造成流程錯誤。就像下面這一段代碼,可算是個明顯的錯誤了。
要是使用do...while(0)將DO_SOMETHING()宏改成這樣,就可以避免上述的錯誤了。
#define?DO_SOMETHING()?do{?\
??? ????DO_A();?\
??? ????DO_B();?\
??? ????DO_C();?\
??? }while(0)
這可就有一個疑問了,何必加上do...while(0)呢,直接使用大括號不就好了么?
不錯,只要在宏中使用大括號就可以把多條語句合成一條語句了。不過,大括號并不是個天山雪蓮般可治百病的靈藥喲。
看看直接使用大括號的程序吧。
#define?DO_SOMETHING()?{\
??? ????DO_A();??\
??? ????DO_B();??\
??? ????DO_C();??\
??? }
??? //
??? if?(CONDITION_A())
??? ????DO_SOMETHING();
??? else
??? ????DO_SOMETHING_ELSE();
看出問題了么?由于if語句下的宏后多的那個小小的分號,if下的一個語句就變成了兩個語句,隨后的else可就會提示你語法錯誤嘍
而使用之前do...while(0)的宏就不會有這個問題,這也就是do...while(0)的第二個用處了。
當然,以上說的這些都是一種無奈的保護機制。如果保持一個良好的編程習慣,比如在if和else后面緊跟大括號,就不需要在乎宏上的do...while(0)了。
只是,可惜的是,當我把do...while(0)使用到公司的代碼中時,卻發現這觸犯了Lint工具的檢測規范,而直接給了我違規的結論。無奈之下,只得把do...while(0)全部刪除。
或許,Lint工具并不是告訴我這樣做違反編程規范,只是想提醒我要養成良好的遵守編程習慣吧
今天總算看到了wiki上對do...while(0)的解釋,算是解了心中的一個疑惑。
一種情況是,這種用法可以避免在if/for下使用宏時,由于宏中的多個語句遺漏大括號而造成流程錯誤。就像下面這一段代碼,可算是個明顯的錯誤了。
? #define?DO_SOMETHING()??DO_A();\
??? ????DO_B();??\
??? ????DO_C()
??? //
??? if?(CONDITION_A)
??? ????DO_SOMETHING();
要是使用do...while(0)將DO_SOMETHING()宏改成這樣,就可以避免上述的錯誤了。
#define?DO_SOMETHING()?do{?\
??? ????DO_A();?\
??? ????DO_B();?\
??? ????DO_C();?\
??? }while(0)
這可就有一個疑問了,何必加上do...while(0)呢,直接使用大括號不就好了么?
不錯,只要在宏中使用大括號就可以把多條語句合成一條語句了。不過,大括號并不是個天山雪蓮般可治百病的靈藥喲。
看看直接使用大括號的程序吧。
#define?DO_SOMETHING()?{\
??? ????DO_A();??\
??? ????DO_B();??\
??? ????DO_C();??\
??? }
??? //
??? if?(CONDITION_A())
??? ????DO_SOMETHING();
??? else
??? ????DO_SOMETHING_ELSE();
看出問題了么?由于if語句下的宏后多的那個小小的分號,if下的一個語句就變成了兩個語句,隨后的else可就會提示你語法錯誤嘍
而使用之前do...while(0)的宏就不會有這個問題,這也就是do...while(0)的第二個用處了。
當然,以上說的這些都是一種無奈的保護機制。如果保持一個良好的編程習慣,比如在if和else后面緊跟大括號,就不需要在乎宏上的do...while(0)了。
只是,可惜的是,當我把do...while(0)使用到公司的代碼中時,卻發現這觸犯了Lint工具的檢測規范,而直接給了我違規的結論。無奈之下,只得把do...while(0)全部刪除。
或許,Lint工具并不是告訴我這樣做違反編程規范,只是想提醒我要養成良好的遵守編程習慣吧
轉載于:https://www.cnblogs.com/Gigabyte/archive/2007/01/18/623263.html
總結
- 上一篇: 找到一个全能的免费空间!支持SQL和.n
- 下一篇: WPF/E 2007年2月CTP发布了