do {} while (0) 主要在宏定義後爲語句中使用,好比:函數
#define macrofun(a, b, c) \ do { \ if (a == 5) \ do_this(b, c); \ } while (0)
首先,咱們定義一個簡單的宏:this
#define SAFE_FREE(p) free(p); p = NULL;
那麼對於以下的代碼3d
if (NULL != p) SAFE_FREE(p); else ; // do something
就會被展開成code
if (NULL != p) free(p); p = NULL;; else ; // do something
1) else找不到if
2) 就算沒有else分支,p = NULL;不管如何都會運行,這和咱們的邏輯不符
3) 出現了兩個分號。
其實咱們把宏定義引用後面的分號刪掉,再把宏定義後的語句用「{}」括起來也能夠解決,也就是這樣:blog
#define SAFE_FREE(p) {free(p); p = NULL;} if (NULL != p) SAFE_FREE(p) else ; // do something
就展開成了class
if (NULL != p) {free(p); p = NULL;} else ; // do something
好的,問題解決了,可是你看到上面的代碼不難受嗎???總想加個分號上去!並且我敲代碼的時候還得注意我到底調用的是函數,仍是引用的宏?分號到底加是不加?多累啊。引用
然而,使用 do {} while (0) 就完美解決了上面的全部問題。請看:im
#define SAFE_FREE(p) do {free(p); p = NULL;} while (0) if (NULL != p) SAFE_FREE(p); else ; // do something
就展開成了img
if (NULL != p) do {free(p); p = NULL;} while (0); else ; // do something