2

查看 Qt 测试框架的一些宏,例如QCOMPARE,这是代码:

#define QCOMPARE(actual, expected) \
do {\
    if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__))\
        return;\
} while (0)

如您所见,有一个while循环。我在 CryEngine 单元测试框架中也发现了同样的事情。我的问题很简单:是否有任何理由使用该循环,或者可能是旧实现留下的东西?

4

1 回答 1

6

您会注意到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();

没有。

于 2015-02-06T10:25:06.843 回答