深度理解do while 0 語句的作用

2021-10-02 10:39:41 字數 1001 閱讀 5822

在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...