gpt4 book ai didi

c++ - 此警告与枚举类大小有关吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:30 26 4
gpt4 key购买 nike

警告:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com