- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
警告:
src/BoardRep.h:49:12: warning: ‘BoardRep::BoardRep::Row::<anonymous struct>::a’
is too small to hold all values of ‘enum class BoardRep::Piece’
[enabled by default]
Piece a:2;
^
枚举:
enum class Piece: unsigned char {
EMPTY,
WHITE,
BLACK
};
使用:
union Row {
struct {
Piece a:2;
Piece b:2;
Piece c:2;
Piece d:2;
Piece e:2;
Piece f:2;
Piece g:2;
Piece h:2;
};
unsigned short raw;
};
对于 enum
我同意 GCC,它可能必须截断,但那是因为 enum
并没有真正与整数和预处理器定义分开。然而 enum class
更强大。如果它不足以假设所有作为整数的 Piece
值都在 0 和 2 之间(含 0 和 2),那么警告是有意义的。否则 GCC 是不必要的挑剔,可能值得邮寄列表说“看,这是一个愚蠢的警告”
您可以在 2 位数据中存储 4 个不同的值,我只需要 3 个不同的值,因此任何长度为 4 或更短的枚举都应该很好地适合给定的 2 位(并且我的枚举确实“导出”(更好的术语? ) 来自无符号类型)。如果我有 5 个或更多 THEN 我会收到警告。
最佳答案
gcc
发出的警告准确无误,无需向邮件列表发送邮件要求他们降低警告出现的可能性。
标准规定,底层类型为 unsigned char
的枚举不能用长度为 2
的位域表示;即使没有枚举具有这样的值(value)。
标准
枚举的基础值即使没有与该值对应的枚举键也是有效的,标准仅规定要存储在枚举中的合法值必须适合基础类型;它没有说明这样的值必须出现在 enum-keys 中。
7.2 Enumeration declarations
[dcl.enum]
7 ... It is possible to define an enumeration that has values not defined by any of its enumerators. ...
注意:引用的部分存在于 C++11 和 C++14 草案中。
注意:表述相同但使用不同术语的措辞可在 C++03 中的 [dcl.enum]p6
下找到
注意:整个[decl.enum]p7
为节省篇幅,本文未包括在内。
详情
enum class E : unsigned char { A, B, C };
E x = static_cast<E> (10);
上面我们初始化x
存储值 10
,即使在 enum class E
的枚举声明中没有enumeration-key这仍然是一个有效的结构。
考虑到上述情况,我们很容易推断出 10
不能存储在长度为 2
的位域中, 所以警告 gcc
只不过是准确的..我们可能会尝试在我们的位域中存储它无法表示的值。
示例
enum class E : unsigned char { A, B, C };
struct A {
E value : 2;
};
A val;
val.value = static_cast<E> (10); // OMG, OPS!?
关于c++ - 此警告与枚举类大小有关吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22606392/
我是一名优秀的程序员,十分优秀!