1. 程式人生 > >do...while(0)的使用

do...while(0)的使用

為什麼需要使用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)我們使得巨集能夠被正確的展開,保留原始的語義,從而保證程式的正確性。