我正在编写一个单元测试,根据预期数组检查一些二进制数据。有问题的预期数组只是一些字节序列,具体并不重要:
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类型和无范围枚举 for 提升后适合的常量表达式 https://stackoverflow.com/a/26974911/1708801在目标类型中,C++11 标准草案部分8.5.4
[dcl.init.列表] says:
从整数类型或无范围枚举类型到整数类型
不能表示原始类型的所有值,除了
其中源是一个常量表达式,其值经过积分后
促销活动将适合目标类型。
这里的问题是有些值不适合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};
^~~~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)