do while(0)
在 linux 核心中,經常會看到 do{}while(0)這樣的語句,許多人開始都會疑惑,
認為 do{}while(0)毫無意義,因為它只會執行一次,加不加 do{}while(0)效果是完全一
樣的,其實 do{}while(0)主要用於巨集定義中。
這裡用乙個簡單點的巨集來演示:
#define safe_free(p) do while(0)
假設這裡去掉 do...while(0),即定義 safe_delete 為:
#define safe_free(p) free(p); p = null;
那麼以下**:
if(null != p)
safe_delete(p)
else
...//do something
會被展開為:
if(null != p)
free(p); p = null;
else
...//do something
展開的**中存在兩個問題:
(1)if 分支後有兩個語句,導致 else 分支沒有對應的 if,編譯失敗;
(2)假設沒有 else 分支,則 safe_free 中的第二個語句無論 if 測試是否通過都
會執行。
將 safe_free 的定義加上{}就可以解決上述問題了,即:
#define safe_free(p)
這樣,**
if(null != p)
safe_delete(p)
else
...//do something
會被展開為:
if(null != p)
else
...//do something
但是,在 c 程式中,每個語句後面加分號是一種約定俗成的習慣,那麼,如下代
碼:
if(null != p)
safe_delete(p);
else
...//do something
將被擴充套件為:
if(null != p)
;else
...//do something
這樣,else 分支就又沒有對應的 if 了,編譯將無法通過。假設用了 do{}while(0),
情況就不一樣了,同樣的**會被展開為:
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 主要用於巨集定義中。這裡用乙個簡單點的巨集來演示 h...
巨集語句 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 粗看我們就會覺得很奇怪,既然迴圈裡面只執...