do...while(0)的使用
阿新 • • 發佈:2018-11-23
為什麼需要使用do...whie(0),我們都知道do{...}while(condition)可以表示迴圈,但我們會遇見一些巨集定義中可以不用迴圈的地方,使用到了do{...}while(0)。
ex:
#define foo(x) do{\
statement1;\
statement2;\
}while(0)
在初次遇見這樣的巨集定義的過程中會覺得比較奇怪,既然迴圈裡面的語句只執行了一次,為什麼會需要看似多餘的do...while(0)有什麼意義。我們為什麼不直接寫出如下表達。
錯誤一:
#define foo(x)
{
statement1;\
statement2;\
}
我們都知道巨集在預處理的過程中會被直接展開
對於上面的例子,在vs會直接提示錯誤,原因是 if(condition) { statement1; statement2; }; else ...
錯誤二: #define Foo(x) (x)+=1;(x)+=1;
if(condition) Foo(x) else ... 會被展開成 if(condition) (x)+=1; (x)+=1; else ... 這樣會被導致else語句孤立而出現編譯錯誤。
總結:通過do{...}while(0)我們使得巨集能夠被正確的展開,保留原始的語義,從而保證程式的正確性。
對於上面的例子,在vs會直接提示錯誤,原因是 if(condition) { statement1; statement2; }; else ...
錯誤二: #define Foo(x) (x)+=1;(x)+=1;
if(condition) Foo(x) else ... 會被展開成 if(condition) (x)+=1; (x)+=1; else ... 這樣會被導致else語句孤立而出現編譯錯誤。
總結:通過do{...}while(0)我們使得巨集能夠被正確的展開,保留原始的語義,從而保證程式的正確性。