do{}while(0)
阿新 • • 發佈:2019-02-13
代碼 能夠 出錯 性能 cti rac 編譯錯誤 ... 進行
有時會在源碼中或在寫代碼時在宏定義中用到do...while(0)
.
采用這種方式進行宏定義, 主要是為了防止出現以下錯誤 :
do{}while(0)
空的宏定義避免出現warnning.
#define foo() do{}while(0)
存在一個獨立的操作, 可以進行變量定義, 進行比較復雜的實現.
若果出現在判斷語句過後的宏, 這樣可以作為一個整體來實現.
#define foo(x) action1(); action2();
在以下情況中就會出錯 :
if (NULL == pointer) foo(); //在這種情況下就會出現 action1, action2不會被同時執行的情況。
使用do{}while(0)原因
以上三種情況均可以用{}
, 實現,但為什麽一定要用do{}while(0).
比如 :
#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)
這種無用的循環, 並對其進行優化, 所以使用這種方法不會導致性能的降低.
do{}while(0)