7

我正在编写一个单元测试,根据预期的数组检查一些二进制数据。有问题的预期数组只是一些字节序列,具体无关紧要:

char expected[] = {0x42, 0xde, 0xad, 0xbe, 0xef};

这在 C++ 中编译得很好,但在 C++11 中,这会在缩小转换时发出警告。我编译是-Werror因为警告很重要,所以该行不适合我编译。据我所知,char没有文字后缀,所以看来我必须这样做:

char expected[] = {static_cast<char>(0x42), static_cast<char>(0xde), ... };

这对我来说似乎很笨拙。有没有更好的方法来构造这个字符数组?(在删除-Werror或添加之外-Wno-narrowing)。

4

1 回答 1

8

因此,C++11 对整数类型和无作用域枚举的常量表达式有一个例外,这些常量表达式在 promtion 之后适合目标类型,草案 C++11 标准部分8.5.4 [dcl.init.list]说:

从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,其值在整数提升后将适合目标类型。

char这里的问题是,如果您使用某些值,unsigned char它应该可以工作。

clang更有帮助的是它会警告哪些特定元素会生成警告,在这种情况下,它不会警告0x42但会警告其余部分,例如:

error: constant expression evaluates to 222 which cannot be narrowed to type 'char' [-Wc++11-narrowing]
char expected[] = {0x42, 0xde, 0xad, 0xbe, 0xef};
                         ^~~~
于 2015-01-22T16:54:34.070 回答