do{}while(0)

有時會在源碼中或在寫代碼時在宏定義中用到do...while(0).性能

採用這種方式進行宏定義, 主要是爲了防止出現如下錯誤 :優化

do{}while(0)

  1. 空的宏定義避免出現warnning.code

    #define foo() do{}while(0)
  2. 存在一個獨立的操做, 能夠進行變量定義, 進行比較複雜的實現.編譯器

  3. 若果出如今判斷語句事後的宏, 這樣能夠做爲一個總體來實現.源碼

    #define foo(x)  \
        action1();  \
        action2();

    在如下狀況中就會出錯 :it

    if (NULL == pointer)
        foo();      //在這種狀況下就會出現 action1, action2不會被同時執行的狀況。

使用do{}while(0)緣由

以上三種狀況都可以用{}, 實現,但爲何必定要用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

本站公眾號
   歡迎關注本站公眾號,獲取更多信息