第3章(3) do{}while(0)語句

do {} while (0) 主要在宏定義後爲語句中使用,好比:函數

#define macrofun(a, b, c)    \
        do {                              \
                if (a == 5)             \
                do_this(b, c);        \
         } while (0)

下面咱們看看這樣的寫法的好處。

首先,咱們定義一個簡單的宏:this

#define SAFE_FREE(p)  free(p); p = NULL;

那麼對於以下的代碼3d

if (NULL != p)
        SAFE_FREE(p);
else
        ;  // do something

就會被展開成code

if (NULL != p)
        free(p); p = NULL;;
else
        ;  // do something

1) else找不到if
2) 就算沒有else分支,p = NULL;不管如何都會運行,這和咱們的邏輯不符
3) 出現了兩個分號。
其實咱們把宏定義引用後面的分號刪掉,再把宏定義後的語句用「{}」括起來也能夠解決,也就是這樣:blog

#define SAFE_FREE(p)  {free(p); p = NULL;}

if (NULL != p)
        SAFE_FREE(p)
else
        ;  // do something

就展開成了class

if (NULL != p)
        {free(p); p = NULL;}
else
        ;  // do something

好的,問題解決了,可是你看到上面的代碼不難受嗎???總想加個分號上去!並且我敲代碼的時候還得注意我到底調用的是函數,仍是引用的宏?分號到底加是不加?多累啊。引用

然而,使用 do {} while (0) 就完美解決了上面的全部問題。請看:im

#define SAFE_FREE(p)  do {free(p); p = NULL;} while (0)

if (NULL != p)
        SAFE_FREE(p);
else
        ;  // do something

就展開成了img

if (NULL != p)
        do {free(p); p = NULL;} while (0);
else
        ;  // do something

相關文章
相關標籤/搜索