创建字符数组以避免缩小

时间:2015-01-22 16:49:05

标签: c++ arrays c++11 narrowing

我正在编写一个单元测试,检查一些预期数组的二进制数据。所讨论的预期数组只是一些字节序列,并不具体:

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)之外。

1 个答案:

答案 0 :(得分:5)

因此,目标类型中的{em>整数类型和constant expressions that fit after promtion unscoped枚举有一个例外,草案C ++ 11标准部分8.5.4 [dcl.init.list] 说:

  

从整数类型或未范围的枚举类型到整数类型   除了之外,它不能代表原始类型的所有值   其中source是一个常量表达式,其值在积分之后   促销将适合目标类型。

这里的问题是,如果您使用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};
                         ^~~~