这是这个问题的后续:
什么';定义宏时使用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
参数有关。
一种可能的解释是,宏确保statement
在description
之前求值。
如果QTest::qVerify
的第一个参数的类型为bool
,那么一个重要的区别是,上下文可转换为bool
的类型比隐式可转换为bool
的类型多。
给定
struct S { explicit operator bool(); } s;
void f(bool);
呼叫f(s)
是无效的,但是if (s) f(true); else f(false);
是有效的。
然而,考虑到您在问题中显示的定义QVERIFY
宏,这似乎从来都不是一个真正的考虑因素。