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)
來包圍執行邏輯,因爲它能確保宏的行爲總是相同的,而不管在調用代碼中使用了多少分號和大括號。
注:直接用大括號直接把宏包圍起來可能會導致語法錯誤