这是对这个问题的跟进:
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
参数有关。
答案 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
宏,看起来这似乎不是真正的考虑因素。