1. 程式人生 > 其它 >巨集定義中的do...while(0)

巨集定義中的do...while(0)

這裡用一個簡單的巨集來演示:

#define SAFE_DELETE(p) do{ delete p; p = NULL} while(0)

假設這裡去掉do...while(0),

#define SAFE_DELETE(p) delete p; p = NULL;

那麼以下程式碼:

if(NULL != p) SAFE_DELETE(p)
else  ...  do sth...

就有兩個問題,
1) 因為if分支後有兩個語句,else分支沒有對應的if,編譯失敗
2) 假設沒有else, SAFE_DELETE中的第二個語句無論if測試是否通過,會永遠執行。
你可能發現,為了避免這兩個問題,我不一定要用這個令人費解的do...while, 我直接用{}括起來就可以了

#define SAFE_DELETE(p) { delete p; p = NULL;}


的確,這樣的話上面的問題是不存在了,但是我想對於C++程式設計師來講,在每個語句後面加分號是一種約定俗成的習慣,這樣的話,以下程式碼:

if(NULL != p) SAFE_DELETE(p);
else   ...do sth...

其else分支就無法通過編譯了(原因同上),所以採用do...while(0)是做好的選擇了。

也許你會說,我們程式碼的習慣是在每個判斷後面加上{}, 就不會有這種問題了,也就不需要do...while了,如:

if(...){}
else{}


誠然,這是一個好的,應該提倡的程式設計習慣,但一般這樣的巨集都是作為library的一部分出現的,而對於一個library的作者,他所要做的就是讓其庫具有通用性,強壯性,因此他不能有任何對庫的使用者的假設,如其編碼規範,技術水平等。

參考:https://www.cnblogs.com/flying_bat/archive/2008/01/18/1044693.html