在linux核心中常常會看到do{} while(0)這樣的語句,有人疑惑,認為無意義,因為他只執行一次,加不加do{} while(0)小過失完全一樣的,那你就錯了,沒有完全了解do{} while(0)。下面看乙個例子:
定義乙個巨集:
#define safe_free(p) do while(0)
假設這裡去掉do while(0),及定義為:
#define safe_free(p) free(p); p=null;
那麼一下**
if(null!=p)
safe_free(p)
else
.......
會被展開成:
if(null!=p)
free(p); p=null;
else
.......
展開存在兩個問題:
因為if分支後面有兩個語句,導致else分支沒有對應的if,編譯失敗。
假設沒有else分支,則safe_free中的第二個語句無論if測試是否通過,都會執行。
如何解決以上問題呢?
有人說給safe_free的定義加上{}就可以解決上述問題了,即:
#define safe_free(p)
**展開如下:
if(null!=p)
else
.......
但是,在c程式中,每個語句後面加分號是一種約定俗成的習慣,那麼**如下:
if(null!=p)
;else
.......
問題又來了,這樣else又沒有對應的if了,編譯還是失敗。假設用了do{} while(0)就可以解決上面的一系列問題了,**如下:
if(null!=p)
do while(0);
else
.......
**: 巨集語句 do while 0
有時程式中重複出現某幾條語句,為了保證程式dry don t repeat yourself 需要將這幾條語句合併為一條語句.在c 中可以選擇用 inline,c語言沒有這個特性,但是可以用巨集實現.正確答案是用dowhile 0 實現,下面推理下為什麼這種方法最好吧.思路一 直接寫在一起 比如要將...
Define 語句中的do while 0
經常在define語句中看到用do while 0 將乙個程式片段包起來,一直感覺很奇怪,經查詢,才發現這是在define語句使用中的乙個tricky的情況。define表達使用do while 0 的兩個例子 define list insert after listelm,elm,field d...
巨集定義中的do while 0 語句
do while 0 在 linux 核心中,經常會看到 do while 0 這樣的語句,許多人開始都會疑惑,認為 do while 0 毫無意義,因為它只會執行一次,加不加 do while 0 效果是完全一 樣的,其實 do while 0 主要用於巨集定義中。這裡用乙個簡單點的巨集來演示 d...