这个宏中的if - else是多余的吗?

时间:2015-02-27 20:11:17

标签: c++ qt

这是对这个问题的跟进:

What's the use of do while(0) when we define a macro?

此宏用于Qt单元测试:

#define QVERIFY2(statement, description) \
do {\
    if (statement) {\
        if (!QTest::qVerify(true, #statement, (description), __FILE__, __LINE__))\
            return;\
    } else {\
        if (!QTest::qVerify(false, #statement, (description), __FILE__, __LINE__))\
            return;\
    }\
} while (0)

它验证语句,如果为false,则会生成带有给定描述的错误消息。

我的问题是,内部if - else声明可能是什么原因?为什么不像这样定义它?

#define QVERIFY2(statement, description) \
do {\
    if (!QTest::qVerify(statement, #statement, (description), __FILE__, __LINE__))\
        return;\
    }\
} while (0)

我怀疑解释与引用的问题中的解释相同。有什么想法吗?

更新

为了给出更多上下文,还定义了以下宏的变体,没有描述:

#define QVERIFY(statement) \
do {\
    if (!QTest::qVerify((statement), #statement, "", __FILE__, __LINE__))\
        return;\
} while (0)

这表明,这个技巧在某种程度上与description参数有关。

2 个答案:

答案 0 :(得分:3)

一种可能的解释是宏确保在statement之前评估description

答案 1 :(得分:1)

如果QTest::qVerify的第一个参数的类型为bool,则一个重要的区别是,上下文可转换bool的类型多于那里是隐式可转换bool

鉴于

struct S { explicit operator bool(); } s;
void f(bool);

来电f(s)无效,但if (s) f(true); else f(false);有效。

但是,鉴于您在问题中显示的定义QVERIFY宏,看起来这似乎不是真正的考虑因素。