有時會在源碼中或在寫代碼時在宏定義中用到do...while(0)
.性能
採用這種方式進行宏定義, 主要是爲了防止出現如下錯誤 :優化
空的宏定義避免出現warnning.code
#define foo() do{}while(0)
存在一個獨立的操做, 能夠進行變量定義, 進行比較複雜的實現.編譯器
若果出如今判斷語句事後的宏, 這樣能夠做爲一個總體來實現.源碼
#define foo(x) \ action1(); \ action2();
在如下狀況中就會出錯 :it
if (NULL == pointer) foo(); //在這種狀況下就會出現 action1, action2不會被同時執行的狀況。
以上三種狀況都可以用{}
, 實現,但爲何必定要用do{}while(0).
io
好比 :編譯
#define switch(x,y) {int tmp; tmp =x; x = y; y = tmp;} if (x > y) switch(x,y); else //出現編譯錯誤,宏引入代碼後多一個分號 otherAction();
將宏用do{}while(0)
將宏包裹起來使其成爲一個獨立的語法單元, 從而不會與上下文發生混淆, 同時大部分編譯器可以識別 do{}while(0)
這種無用的循環, 並對其進行優化, 因此使用這種方法不會致使性能的下降.class