有关 C/C++ 中的 do { ... } while (0) 惯用法

C/C++ 中的宏是个让人又爱又恨的家伙(感觉这句话好俗啊),在带给我们很强大的 Power 的同时,却也需要我们绝对的细心,而这也是在宏定义中诸多惯用法的由来。

当我们要把一组语句定义成一个宏,并希望像用一条语句那样来使用它的时候,我们就可以这样做:

1
2
3
4
5
6
#define MACROX \
    do { \
        statement1 \
        statement2 \
        ... \
    } while (0)

之后,我们只要在调用方写 MACROX; 就可以了。之所以不能简单的用花括号把这一组语句括起来,是为了防止扰乱 if 语句中的 else 子句的匹配问题。嗯,确实是个不错的主意啊,直到我遇到了一个,嗯,也许只有我才会遇到的问题。那就是,我在这组语句中,不能用 breakcontinue 。是不是觉得这需求蛮诡异的,呵呵,连我自己都觉得,不过这是我在重构一些相似的循环体时遇到的。但总之,我是找到了另外的一种包装方法啦,自己想想也没什么问题,大概,就像下面这样:

1
2
3
4
5
6
#define MACROX \
    if (true) { \
        statement1 \
        statement2 \
        ... \
    } else

嗯,看起来是不是要比大家都知道的那个诡异很多啊。不管了,以后发现问题了再说吧。

 Share!

 
comments powered by Disqus