而循环内部单元测试框架

Ste*_*ano 2 c++ qt unit-testing cryengine

看一下Qt Test Framework的一些宏QCOMPARE,这就是代码:

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

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

Win*_*ute 6

您会注意到while条件始终为false,因此没有实际循环.这是在预处理器宏中使用块并且最后仍然需要分号的常见技巧(因此使用宏感觉就像使用函数,并且不要混淆一些压头).也就是说,

QCOMPARE(foo, bar); // <-- works
QCOMPARE(foo, bar)  // <-- will not work.
Run Code Online (Sandbox Code Playgroud)

这是在上下文中最有用的ifelse,其中

if(something)
  QCOMPARE(foo, bar);
else
  do_something();
Run Code Online (Sandbox Code Playgroud)

将扩大到

if(something)
  do stuff() while(0);
else
  do_something();
Run Code Online (Sandbox Code Playgroud)

哪个有效,而带有块而没有循环结构的多行宏将扩展为

if(something)
  { stuff() }; // <-- if statement ends here
else           // <-- and this is at best a syntax error.
  do_something();
Run Code Online (Sandbox Code Playgroud)

没有.