C++中看到宏定義中使用do{}while(0),爲啥

      在看別人的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


  1. 有時候只是爲了代碼分塊,比僅僅使用{}更直觀些。
  2. 當你執行一段代碼到一半,想跳過剩下的一半的時候,如果你正處於do while循環中,則能用break達到這個目的。
  3. 變形的goto,有些公司不讓用goto
  4. 這樣做也可以是兼容各種編譯器。
  5. 爲了展開的時候不會出錯。如果直接放在花括號裏會出錯的

比如:

#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)解決得比較好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章