【发布时间】:2015-02-28 05:05:46
【问题描述】:
这是对这个问题的跟进:
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)
它验证语句,如果它是假的,它会产生一条带有给定描述的错误消息。
我的问题是,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是一个布尔值(if(statement)),否则我们不能确定qVerify(statement..,不看qVerify定义 -
宏所做的一件事是确保在
description之前评估statement。 -
@rici 它还确保
description被评估,无论分支采用哪种方式。 -
@1nflktd,我也是这么想的,但本来可以这样做
if (!QTest::qVerify((statement) != 0, ...