如果我运行以下测试女巫Catch
mine.add(new StructApplication(model));
我得到以下输出
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));
}
为什么Catch可以将/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
和x
转换为运算符表达式y
中的字符串,但不能转换为函数调用表达式x == y
中的字符串?是否有可能以类似的方式对函数调用表达式进行字符串化以获得如下输出:
eq(x, y)
答案 0 :(得分:2)
我怀疑CHECK
看到eq(x, y)
后,它只会将此函数调用的结果视为表达式。
您可以在INFO
之前插入CHECK
来查看函数调用的参数:
INFO("x:" << x << ", y:" << y);
CHECK(eq(x, y));
将在CHECK
电话中记录(显示&#34;带有消息&#34;):
CHECK( eq(x, y) )
with expansion:
false
with message:
x:1, y:2
答案 1 :(得分:1)
有趣的部分是this:
#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 == y
或eq(x, y)
。
如何使用 x == y
:
由于__catchResult <= expr
与__catchResult <= x == y
相比优先级较低(C++ operator precedence),(__catchResult <= x) == y
会产生<=
,相当于==
。 __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