2016-11-30 122 views
1

在一些代码,我发现了以下行:C++ CPPUNIT_ASSERT有两个参数

CPPUNIT_ASSERT(1, val.getBytefield().size()); 

这是否真的是平等的两个参数比较?通常情况下,我希望与CPPUNIT_ASSERT_EQUAL这种比较:

CPPUNIT_ASSERT_EQUAL(1, val.getBytefield().size()); 

测试编译并断言在1的情况下工作,但不是在的情况下2.如果是有什么区别?

+0

'CPPUNIT_ASSERT'只接受1周的说法,怎么能第一个版本的工作? – Danh

+0

要清楚:我们要比较大小和期望值1.在情况1中,代码编译和运行测试时断言是可以的。在情况2中,代码编译但运行测试时断言不正确。 – Doenbot3000

回答

1

这看起来像破碎的代码给我,可能是一些重构或其他编辑完成的结果。

CPPUNIT_ASSERT宏接受一个参数 - 一个条件表达式 - 并断言该条件为真(,即,如果它为false,则失败)。

此代码试图传递两个参数,但不是作为参数分隔符在这里,逗号实际上是作为(有点模糊的)comma operator工作的。逗号运算符评估其第一个操作数,放弃结果,然后评估第二个操作数的结果。因此,最初的1是无关紧要的。该代码是等同于:

CPPUNIT_ASSERT(val.getBytefield().size()); 

这意味着它断言字节字段具有一个非零的大小。

显然,这是从你的代码第二片段不同:

CPPUNIT_ASSERT_EQUAL(1, val.getBytefield().size()); 

,它断言字节字段的大小是正好等于1

+1

我明白了。所以我应该真的重构这段代码,因为它已经坏掉了,对吧?我真的无法想出办法,有人想在这里实施第一个案例。 – Doenbot3000

0

好像你正在使用的编译器有一个扩展,它接受2个参数给一个参数宏。我想这是MSVC,看到this

因此,宏将检查的第一个参数是真还是假,你的情况,这是1,这是上下文转换到booltrue,通过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(), \ 
          "")) 

assertEquals

template<class T> 
void assertEquals ( const T & expected, 
    const T & actual, 
    SourceLine sourceLine, 
    const std::string &  message 
) 

由于1int)类型并返回的.size()类型(std::size_t)是不同的,那么没有匹配函数可以发现,编译器可以不编译你的代码。


我认为这是解决方案:

CPPUNIT_ASSERT(1 == val.getBytefield().size()); 
CPPUNIT_ASSERT_EQUAL(std::size_t(1), val.getBytefield().size());