创建字符数组,避免缩小范围
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 对于整数类型和适合目标类型中 promtion 之后的常量表达式的无作用域枚举有一个例外,草案 C++11 标准部分 8.5.4
[dcl.init.list] 说:
从整数类型或无作用域枚举类型到整数类型 不能表示原始类型的所有值,除了 其中源是一个常量表达式,其值在积分之后 促销活动将适合目标类型。
这里的问题是,如果您使用unsigned char
,某些值不适合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};
^~~~
相关文章:
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- 为什么 gcc 警告只针对统一初始化缩小转换范围?
- 标准是否阻止在可变参数模板中使用足够小的文本值缩小文本转换范围
- 从'::size_t'转换为'int'需要缩小转换范围
- 在基于范围的循环范围内的双/整数使用和数据缩小
- 列表初始化时需要缩小转换范围
- 从'double'转换为'int'需要缩小转换范围
- 正在缩小MSVC中到布尔警告的转换范围
- 将转换范围缩小到更大的类型(然后再回来)
- 为什么缩小转换范围不能防止错误类型的map.insert()失败
- 常量之前的预期主要表达。缩小了范围,但仍然找不到。
- 在Linux上构建Ogre时出错:缩小转换范围
- 有没有办法使用模板来避免缩小转换范围
- 缩小 C++11 中的转换范围:"actual value after conversion"是什么?
- 将转换范围从无符号缩小到双精度
- 警告缩小转换范围(uint32 到 uint8)
- 创建字符数组,避免缩小范围
- 套接字动态绑定到缩小范围
- 从'float'转换为'LONG'需要缩小转换范围
- 从文字缩小范围不会引起警告