1. 程式人生 > >do{}while(0)

do{}while(0)

代碼 能夠 出錯 性能 cti rac 編譯錯誤 ... 進行

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

采用這種方式進行宏定義, 主要是為了防止出現以下錯誤 :

do{}while(0)

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

    #define foo() do{}while(0)
  2. 存在一個獨立的操作, 可以進行變量定義, 進行比較復雜的實現.

  3. 若果出現在判斷語句過後的宏, 這樣可以作為一個整體來實現.

    #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)