3

如果我运行以下测试女巫Catch

bool eq(int x, int y) {
    return x == y;
}

TEST_CASE("operator vs. function call") {
    int x = 1;
    int y = 2;
    CHECK(x == y);
    CHECK(eq(x, y));
}

我得到以下输出

/path/to/MyTest.cpp:8: Failure:
  CHECK(x == y)
with expansion:
  1 == 2

/path/to/MyTest.cpp:9: Failure:
  CHECK(eq(x, y))
with expansion:
  false

为什么 Catch 可以在运算符表达式中转换xandy为字符串,x == y但不能在函数调用表达式中eq(x, y)?是否有可能以类似的方式对函数调用表达式进行字符串化以获得如下输出:

/path/to/MyTest.cpp:9: Failure:
  CHECK(eq(x, y))
with expansion:
  eq(1, 2)
4

2 回答 2

2

我怀疑一旦CHECK看到eq(x, y)它只是将此函数调用的结果视为表达式。

INFO您可以在您之前插入一个CHECK来查看函数调用的参数:

INFO("x:" << x << ", y:" << y);
CHECK(eq(x, y));

这将在CHECK通话中记录(显示“带有消息”):

  CHECK( eq(x, y) )
with expansion:
  false
with message:
  x:1, y:2
于 2017-03-15T11:24:21.437 回答
1

有趣的部分

#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \
    do { \
        Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
        try { \
            CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
            ( __catchResult <= expr ).endExpression(); \
            CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \
        } \
        catch( ... ) { \
            __catchResult.useActiveException( resultDisposition ); \
        } \
        INTERNAL_CATCH_REACT( __catchResult ) \
    } while( Catch::isTrue( false && static_cast<bool>( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
    // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.

expr在哪里。x == yeq(x, y)

它是如何工作的 x == y
__catchResult <= expr结果__catchResult <= x == y相当于(__catchResult <= x) == y由于<=比较的优先级较低==(参见C++ 运算符优先级)。__catchResult <= x用操作符包装x在一个对象中,该==操作符y被传递给。这就是expr被解构的方式。其余的一切都很容易想象。

为什么它不起作用 eq(x, y)

__catchResult <= expr结果__catchResult <= eq(x, y)eq(x, y)首先被评估(无解构)。

出于同样的原因,如果表达式被括号括起来,它也不起作用。例如,(x == y)将导致__catchResult <= (x == y)在哪种情况下x == y首先评估(无解构)。这就是为什么CHECK((x == y));导致输出

/path/to/MyTest.cpp:8: Failure:
  CHECK((x == y))
with expansion:
  false
于 2017-03-15T12:36:20.703 回答