此宏中的if-else是否多余

  • 本文关键字:是否 多余 if-else c++ qt
  • 更新时间 :
  • 英文 :


这是这个问题的后续:

什么';定义宏时使用do while(0)有什么用?

此宏用于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参数有关。

一种可能的解释是,宏确保statementdescription之前求值。

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

给定

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

呼叫f(s)是无效的,但是if (s) f(true); else f(false);是有效的。

然而,考虑到您在问题中显示的定义QVERIFY宏,这似乎从来都不是一个真正的考虑因素。

最新更新