创建字符数组避免缩小
Create array of chars avoiding 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
之外)。
所以 C++11 对于 integer 类型和 unscoped enums 对于目标类型中的 constant expressions that fit after promtion 有一个例外, C++11 标准草案 8.5.4
[dcl.init.list] 说:
from an integer type or unscoped enumeration type to an integer type
that cannot represent all the values of the original type, except
where the source is a constant expression whose value after integral
promotions will fit into the target type.
这里的问题是某些值不适合 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};
^~~~
我正在编写一个单元测试,根据预期的数组检查一些二进制数据。有问题的预期数组只是一些字节序列,具体无关紧要:
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
之外)。
所以 C++11 对于 integer 类型和 unscoped enums 对于目标类型中的 constant expressions that fit after promtion 有一个例外, C++11 标准草案 8.5.4
[dcl.init.list] 说:
from an integer type or unscoped enumeration type to an integer type that cannot represent all the values of the original type, except where the source is a constant expression whose value after integral promotions will fit into the target type.
这里的问题是某些值不适合 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};
^~~~