在看別人的c++代碼時老看到宏定義的時候把要執行的部分寫在do{}while(0)中,do{}while(0)表示執行一次do{}中的代碼,那爲什麼不直接正常寫代碼呢?網上搜了一下,總結了幾個比較好的答案,我果然已經不會寫C++了……
參考博文:
https://segmentfault.com/q/1010000000608439
https://bbs.csdn.net/topics/390361821?page=1#post-393624278
https://www.cnblogs.com/zhuyf87/archive/2013/02/01/2889507.html
- 有時候只是爲了代碼分塊,比僅僅使用
{}
更直觀些。 - 當你執行一段代碼到一半,想跳過剩下的一半的時候,如果你正處於
do while
循環中,則能用break
達到這個目的。 - 變形的
goto
,有些公司不讓用goto
。 - 這樣做也可以是
兼容
各種編譯器。 - 爲了
宏
展開的時候不會出錯。如果直接放在花括號
裏會出錯的
比如:
#define DO_SOMETHING {int time = 100 ;make_love(i);}
//宏定義展開的地方
if(you->strong())DO_SOMETHING;
else ..;
展開後是這樣的:
if(you->strong())
{int time = 100 ;make_love(i);}
;
else ..;
那麼編譯就會出錯,可以驗證使用d0{}while(0)就不會出錯,linux內核源碼經常見這玩意。
假如a, b分別是兩條c語句,定義一個順序執行他們的宏有幾種寫法,比如:
#define AB1 a; b; // x, 下面語句b不能被執行: if (cond) AB1;因爲沒有{}。
#define AB2 { a; b; } // x, 下面語句編譯出錯:if (cond) AB2; else ...;因爲{}後面有;
#define AB3 a, b // x, 有運算符優先級問題
#define AB4 do { a; b; } while (0)
前面幾個都是有問題的,只有do while(0)解決得比較好。