在一些代码,我发现了以下行:C++ CPPUNIT_ASSERT有两个参数
CPPUNIT_ASSERT(1, val.getBytefield().size());
这是否真的是平等的两个参数比较?通常情况下,我希望与CPPUNIT_ASSERT_EQUAL这种比较:
CPPUNIT_ASSERT_EQUAL(1, val.getBytefield().size());
测试编译并断言在1的情况下工作,但不是在的情况下2.如果是有什么区别?
在一些代码,我发现了以下行:C++ CPPUNIT_ASSERT有两个参数
CPPUNIT_ASSERT(1, val.getBytefield().size());
这是否真的是平等的两个参数比较?通常情况下,我希望与CPPUNIT_ASSERT_EQUAL这种比较:
CPPUNIT_ASSERT_EQUAL(1, val.getBytefield().size());
测试编译并断言在1的情况下工作,但不是在的情况下2.如果是有什么区别?
这看起来像破碎的代码给我,可能是一些重构或其他编辑完成的结果。
宏CPPUNIT_ASSERT
宏接受一个参数 - 一个条件表达式 - 并断言该条件为真(,即,如果它为false,则失败)。
此代码试图传递两个参数,但不是作为参数分隔符在这里,逗号实际上是作为(有点模糊的)comma operator工作的。逗号运算符评估其第一个操作数,放弃结果,然后评估第二个操作数的结果。因此,最初的1
是无关紧要的。该代码是等同于:
CPPUNIT_ASSERT(val.getBytefield().size());
这意味着它断言字节字段具有一个非零的大小。
显然,这是从你的代码第二片段不同:
CPPUNIT_ASSERT_EQUAL(1, val.getBytefield().size());
,它断言字节字段的大小是正好等于1
我明白了。所以我应该真的重构这段代码,因为它已经坏掉了,对吧?我真的无法想出办法,有人想在这里实施第一个案例。 – Doenbot3000
好像你正在使用的编译器有一个扩展,它接受2个参数给一个参数宏。我想这是MSVC,看到this
因此,宏将检查的第一个参数是真还是假,你的情况,这是1,这是上下文转换到bool
值true
,通过this expansion
#define CPPUNIT_ASSERT(C) \
(CPPUNIT_NS::Asserter::failIf(!(C), \
CPPUNIT_NS::Message("assertion failed", \
"Expression: " #C), \
CPPUNIT_SOURCELINE()))
可以增加一倍变更确认我的发言:
CPPUNIT_ASSERT(1, val.getBytefield().size());
有:
CPPUNIT_ASSERT(1000, val.getBytefield().size());
CPPUNIT_ASSERT_EQUAL(1, val.getBytefield().size());
从我的实验,.size()
可能会返回一个std::size_t
。从definition of CPPUNIT_ASSERT_EQUAL
:
#define CPPUNIT_ASSERT_EQUAL(expected,actual) \
(assertEquals((expected), \
(actual), \
CPPUNIT_SOURCELINE(), \
""))
template<class T>
void assertEquals ( const T & expected,
const T & actual,
SourceLine sourceLine,
const std::string & message
)
由于1
(int
)类型并返回的.size()
类型(std::size_t
)是不同的,那么没有匹配函数可以发现,编译器可以不编译你的代码。
我认为这是解决方案:
CPPUNIT_ASSERT(1 == val.getBytefield().size());
CPPUNIT_ASSERT_EQUAL(std::size_t(1), val.getBytefield().size());
'CPPUNIT_ASSERT'只接受1周的说法,怎么能第一个版本的工作? – Danh
要清楚:我们要比较大小和期望值1.在情况1中,代码编译和运行测试时断言是可以的。在情况2中,代码编译但运行测试时断言不正确。 – Doenbot3000