我們都知道do while迴圈,但是在巨集定義中常常會出現dowhile(0);的用法,這樣的迴圈不是只執行一次嗎?不用do while也可以實現相同的功能呀,那麼為什麼要使用dowhile(0);呢?
我們先來分析幾個例子:
#define fun(x) func1(x);func2(x)
if (true)
fun(x);
上述**會展開成:
if (true)
func1(x);
func2(x);
這和我們巨集定義的意圖不一樣,因為我們想要在if語句裡面執行func1和func2,而現在執行了func1。
你可能會問,這樣在巨集裡面加上大括號{}不就行了嗎?我們再來看看下面的例子:
#define fun(x)
if (true)
fun(x);
else
retrun 0;
上述**會展開成:
if (true);
else
return 0;
我們可以看到if…else…語句出現了語法錯誤。
將巨集定義改為dowhile(0);的形式:
#define fun(x) dowhile(0);
if (true)
fun(x);
else
return 0;
上述**會展開成:
if (true)
dowhile(0);
else
return 0;
上述展開的**無論從語法上還是邏輯上都沒有錯誤了。總的來說,在巨集定義中使用dowhile(0);是為了在巨集定義中使用多個語句塊而不會受大括號和分號的影響。 巨集定義中的do while 0
如果你是c 程式設計師,我有理由相信你用過,或者接觸過,至少聽說過mfc,在mfc的afx.h檔案裡面,你會發現很多巨集定義都是用了do.while 0 或do.while false 比如說 define afxassume cond do while 0 粗看我們就會覺得很奇怪,既然迴圈裡面只執...
巨集定義中的do while 0 語句
do while 0 在 linux 核心中,經常會看到 do while 0 這樣的語句,許多人開始都會疑惑,認為 do while 0 毫無意義,因為它只會執行一次,加不加 do while 0 效果是完全一 樣的,其實 do while 0 主要用於巨集定義中。這裡用乙個簡單點的巨集來演示 d...
巨集定義中的do while 0 語句
do while 0 在 linux 核心中,經常會看到 do while 0 這樣的語句,許多人開始都會疑惑,認為 do while 0 毫無意義,因為它只會執行一次,加不加 do while 0 效果是完全一 樣的,其實 do while 0 主要用於巨集定義中。這裡用乙個簡單點的巨集來演示 h...