我正在编写一个单元测试,检查一些预期数组的二进制数据。所讨论的预期数组只是一些字节序列,并不具体:
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
)之外。
答案 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};
^~~~