【问题标题】:While loop inside unit testing framework单元测试框架内的while循环
【发布时间】:2015-02-06 10:07:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ qt unit-testing cryengine


    【解决方案1】:

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

    QCOMPARE(foo, bar); // <-- works
    QCOMPARE(foo, bar)  // <-- will not work.
    

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

    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();
    

    没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-23
      • 2011-01-22
      • 2010-09-10
      • 2023-04-10
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多