C 語言雜談(三):do {...} while (0) 的作用

C 語言中可以使用 do {...} while (0) 進行 #define 多語句宏定義操作,使用 do{...} while(0) 構造後的宏定義不會受到大括號、分號等的影響,總是會按你期望的方式調用運行。以下是示例:

1. do {...} while (0) 使用示例

首先定義一個多語句宏:

#define foo(x) bar(x); baz(x)

然後對比以下三種調用方式。

1.1 通過 foo(wolf) 調用宏

調用宏:

foo(wolf);

宏擴展後:

bar(wolf); baz(wolf);

在這種情況下確實是期望的輸出結果。

1.2 通過 if 調用宏

調用宏:

if (!feral)
    foo(wolf);

宏擴展後:

if (!feral)
    bar(wolf);
baz(wolf);

在這種情況下顯而易見就不是期望的結果了,所以我們需要採取第三種調用方式。

1.3 通過 do{...}while(0) 調用宏

調用宏:

if (!feral)
    do { bar(wolf); baz(wolf); } while (0);

宏擴展後可以等價爲以下:

if (!feral) {
    bar(wolf);
    baz(wolf);
}

do 能確保大括號裏的邏輯能被執行,而 while(0) 能確保該邏輯只被執行一次,即與沒有循環時一樣。Linux 和其它代碼庫裏的宏都用do/while(0) 來包圍執行邏輯,因爲它能確保宏的行爲總是相同的,而不管在調用代碼中使用了多少分號和大括號。

注:直接用大括號直接把宏包圍起來可能會導致語法錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章