- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读一些代码,我在枚举的最后一个值中发现了这个 _BIG_ENUM=0xFFFFFFFF。这一行的正确含义是什么。而这个_BIG_ENUM 并没有在代码的任何地方使用;
#define CLS_COMM_CONFIG PORT_0,BAUD_9600,DATA_BIT_8,ONE_STOP,NO_FLOW_CONTROL
#define PLS_COMM_CONFIG PORT_1,BAUD_115200,DATA_BIT_8,ONE_STOP,NO_FLOW_CONTROL
typedef enum _comm_config
{
_Zero=0,
PORT_0=_Zero,
BAUD_2400=_Zero,
NONE=_Zero,
HALF_STOP=_Zero,
DATA_BIT_5=_Zero,
NO_FLOW_CONTROL=_Zero,
_One = 1,
PORT_1=_One,
BAUD_4800=_One,
ODD=_One,
ONE_STOP=_One,
DATA_BIT_6=_One,
_Two=2,
PORT_2=_Two,
BAUD_9600=_Two,
EVEN=_Two,
TWO_STOP=_Two,
DATA_BIT_7=_Two,
_Three=3,
PORT_3=_Three,
BAUD_19200=_Three,
DATA_BIT_8=_Three,
_Four=5,
PORT_5=_Four,
BAUD_115200=_Four,
DATA_BIT_9=_Four,
_BIG_ENUM=0xFFFFFFFF,
}COMMConfig;
最佳答案
这没有任何意义,是一个错误。
我想程序员不太清楚枚举是如何工作的,并且认为他们可以通过将一个大整数常量分配给其中一个枚举常量来强制枚举变为 32 位。这是事实,但他们选择了一个错误的值,该值不会像他们想象的那样起作用。
问题在于,虽然枚举变量可能具有实现定义的大小,但枚举常量(例如_BIG_ENUM
)总是 em> 类型 int
1)。
但是 0xFFFFFFFF
不适合 32 位 int
所以这是一个错误。十六进制常量 0xFFFFFFFF
实际上是 unsigned int
类型(假设为 32 位)并且它不适合,因此将有一个实现定义的从有符号到无符号的转换。这意味着我们最终在 2 的补码系统上得到值 -1
。虽然严格标准设置的gcc和clang甚至在枚举常量被赋予大于INT_MAX
的整数常量时拒绝编译代码。
当遇到值为 -1
的枚举常量时,编译器可以自由选择任何有符号类型2) 作为该类型的枚举变量,不一定是 32咬一口
可以通过将代码更改为 _BIG_ENUM=INT_MAX,
(limits.h) 来修复该代码。然后枚举类型将变为 int
或 unsigned int
。
1) C17 6.7.2.2/1
The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an
int
.
2) C16 6.7.2.2/4
Each enumerated type shall be compatible with
char
, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined,128) but shall be capable of representing the values of all the members of the enumeration.128) An implementation may delay the choice of which integer type until all enumeration constants have been seen.
关于c - _BIG_ENUM=0xFFFFFFFF 在枚举的最后是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58427181/
我正在阅读一些代码,我在枚举的最后一个值中发现了这个 _BIG_ENUM=0xFFFFFFFF。这一行的正确含义是什么。而这个_BIG_ENUM 并没有在代码的任何地方使用; #define CLS_
我是一名优秀的程序员,十分优秀!