在单元测试框架内循环
While loop inside unit testing framework
查看 Qt 测试框架的一些宏,如 QCOMPARE
,这是代码:
#define QCOMPARE(actual, expected) \
do {\
if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__))\
return;\
} while (0)
如您所见,有一个 while 循环。我也在 CryEngine 单元测试框架中发现了同样的东西。我的问题很简单:是否有任何理由使用该循环,或者可能是旧实现留下的东西?
您会注意到 while
条件始终为假,因此没有实际的循环。在预处理器宏中包含块并且在末尾仍然需要分号是一个常见的技巧(因此使用宏就像使用函数一样,并且不会混淆某些缩进)。也就是说,
QCOMPARE(foo, bar); // <-- works
QCOMPARE(foo, bar) // <-- will not work.
这在 if
和 else
的上下文中最有用,其中
if(something)
QCOMPARE(foo, bar);
else
do_something();
将扩展到
if(something)
do stuff() while(0);
else
do_something();
有效,而带有块且没有循环结构的多行宏将扩展为
if(something)
{ stuff() }; // <-- if statement ends here
else // <-- and this is at best a syntax error.
do_something();
没有。
查看 Qt 测试框架的一些宏,如 QCOMPARE
,这是代码:
#define QCOMPARE(actual, expected) \
do {\
if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__))\
return;\
} while (0)
如您所见,有一个 while 循环。我也在 CryEngine 单元测试框架中发现了同样的东西。我的问题很简单:是否有任何理由使用该循环,或者可能是旧实现留下的东西?
您会注意到 while
条件始终为假,因此没有实际的循环。在预处理器宏中包含块并且在末尾仍然需要分号是一个常见的技巧(因此使用宏就像使用函数一样,并且不会混淆某些缩进)。也就是说,
QCOMPARE(foo, bar); // <-- works
QCOMPARE(foo, bar) // <-- will not work.
这在 if
和 else
的上下文中最有用,其中
if(something)
QCOMPARE(foo, bar);
else
do_something();
将扩展到
if(something)
do stuff() while(0);
else
do_something();
有效,而带有块且没有循环结构的多行宏将扩展为
if(something)
{ stuff() }; // <-- if statement ends here
else // <-- and this is at best a syntax error.
do_something();
没有。