巨集定義中的do while 0 語句

2021-06-07 23:21:10 字數 1831 閱讀 1475

do while(0)

在 linux 核心中,經常會看到 do{}while(0)這樣的語句,許多人開始都會疑惑,

認為 do{}while(0)毫無意義,因為它只會執行一次,加不加 do{}while(0)效果是完全一

樣的,其實 do{}while(0)主要用於巨集定義中。

這裡用乙個簡單點的巨集來演示:

[html]view plain

copy

#define safe_free(p) do while(0)  

假設這裡去掉 do...while(0),即定義 safe_delete 為:

[html]view plain

copy

#define safe_free(p) free(p); p = null;  

那麼以下**:

[cpp]view plain

copy

if(null != p)  

safe_delete(p)  

else

...//do something

會被展開為:

[cpp]view plain

copy

if(null != p)  

free(p); p = null;  

else

...//do something

展開的**中存在兩個問題:

(1)if 分支後有兩個語句,導致 else 分支沒有對應的 if,編譯失敗;

(2)假設沒有 else 分支,則 safe_free 中的第二個語句無論 if 測試是否通過都

會執行。

將 safe_free 的定義加上{}就可以解決上述問題了,即:

[html]view plain

copy

#define safe_free(p)   

這樣,**

[html]view plain

copy

if(null != p)  

safe_delete(p)  

else  

...//do something  

會被展開為:  

if(null != p)  

else  

...//do something  

但是,在 c 程式中,每個語句後面加分號是一種約定俗成的習慣,那麼,如下代

碼:[html]view plain

copy

if(null != p)  

safe_delete(p);  

else  

...//do something  

將被擴充套件為:  

if(null != p)  

;  else  

...//do something  

這樣,else 分支就又沒有對應的 if 了,編譯將無法通過。假設用了 do{}while(0),

情況就不一樣了,同樣的**會被展開為:

[html]view plain

copy

if(null != p)  

do while(0);  

else  

...//do something  

不會再出現編譯問題。

do{}while(0)的使用完全是為了保證巨集定義的使用者能無編

譯錯誤地使用巨集,它不對其使用者做任何假設。

巨集定義中的do while 0 語句

do while 0 在 linux 核心中,經常會看到 do while 0 這樣的語句,許多人開始都會疑惑,認為 do while 0 毫無意義,因為它只會執行一次,加不加 do while 0 效果是完全一 樣的,其實 do while 0 主要用於巨集定義中。這裡用乙個簡單點的巨集來演示 d...

巨集語句 do while 0

有時程式中重複出現某幾條語句,為了保證程式dry don t repeat yourself 需要將這幾條語句合併為一條語句.在c 中可以選擇用 inline,c語言沒有這個特性,但是可以用巨集實現.正確答案是用dowhile 0 實現,下面推理下為什麼這種方法最好吧.思路一 直接寫在一起 比如要將...

巨集定義中的do while 0

如果你是c 程式設計師,我有理由相信你用過,或者接觸過,至少聽說過mfc,在mfc的afx.h檔案裡面,你會發現很多巨集定義都是用了do.while 0 或do.while false 比如說 define afxassume cond do while 0 粗看我們就會覺得很奇怪,既然迴圈裡面只執...