如何使用 cppunit 断言宏来检查返回数据类型的预处理器值?
Posted
技术标签:
【中文标题】如何使用 cppunit 断言宏来检查返回数据类型的预处理器值?【英文标题】:How to use cppunit assert macros to check against preprocessor value which returns data type? 【发布时间】:2016-01-29 08:54:44 【问题描述】:我有一个预处理器指令列表:
#define __SIZE_TYPE__ long unsigned int
#define __UINT16_TYPE__ short unsigned int
#define __UINT_LEAST8_TYPE__ unsigned char
#define __VERSION__ 4
.
.
现在我正在编写一个 cppunit 测试用例来检查这些指令的值,如下所示:
CPPUNIT_ASSERT_EQUAL(4, __VERSION__);
现在我想为 UINT16_TYPE 、 SIZE_TYPE 、 UINT_LEAST8_TYPE 编写相同的 cppunit 断言,以确保它们具有正确的值,但我没有得到我应该使用哪个 cppunit 断言?那么,请建议为此目的使用哪个 cppunit 断言?
【问题讨论】:
您是否在自己的项目头文件中自己定义这些宏?然后不要。以双下划线are reserved in all scopes for the implementation (compiler and standard library)开头的名称。 @JoachimPileborg 不,我没有自己定义它们,它们是由 gcc -dM -E 生成的 - /null 命令 【参考方案1】:如果您使用 C++11,请使用 std::is_same 检查类型。 http://en.cppreference.com/w/cpp/types/is_same
例如:CPPUNIT_ASSERT(std::is_sameSIZE_TYPE, long unsigned int>::value)
但老实说,我认为此类检查没有任何理由。
【讨论】:
【参考方案2】:从它们的名字来看,它们似乎是用于<cstdint>
头文件中定义的“标准”整数的宏。
在这种情况下,__UINT16_TYPE__
应该是一个无符号的 16 位值,这很容易测试。你可以这样做,例如
CPPUNIT_ASSERT_EQUAL(2, sizeof(__UINT16_TYPE__));
这当然取决于您使用的是基于 8 位字节的“普通”计算机。
要检查类型,您可以使用 C++11 type-traits,如 std::is_integral
或 std::is_unsigned
。
我真的不明白做这些检查的意义。如果这些宏是由编译器生成的,那么您可以确定它们对于您所在的平台是正确的。
【讨论】:
加上CPPUNIT_ASSERT_GREATER( 0, static_cast<__UINT16_TYPE__>(-1));
。
CPPUNIT_ASSERT_GREATER 仅在 cppunit 未发布的 master 分支中。以上是关于如何使用 cppunit 断言宏来检查返回数据类型的预处理器值?的主要内容,如果未能解决你的问题,请参考以下文章