c - 在枚举的最后一个_BIG_ENUM=0xFFFFFFFF是什么意思?
问题描述
我正在阅读一些代码,我在枚举的最后一个值中发现了这个 _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
类型为1 int
)。
但0xFFFFFFFF
不适合 32 位int
,所以这是一个错误。十六进制常量0xFFFFFFFF
实际上是类型unsigned int
(假设是 32 位)并且它不适合,所以会有一个实现定义的从有符号到无符号的转换。这意味着我们最终得到了-1
2 的补码系统的值。尽管具有严格标准设置的 gcc 和 clang 甚至在枚举常量被赋予一个大于INT_MAX
.
当遇到枚举常量 value-1
时,编译器可以自由选择任何有符号类型2)用于该类型的枚举变量,不一定是 32 位变量。
_BIG_ENUM=INT_MAX,
可以通过将代码更改为(limits.h)来修复代码。然后枚举类型将变为int
或unsigned int
。
1) C17 6.7.2.2/1
定义枚举常量值的表达式应为整数常量表达式,其值可表示为
int
.
2) C16 6.7.2.2/4
每个枚举类型应与
char
有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,128) 但应该能够表示枚举的所有成员的值。128) 一个实现可能会延迟选择哪种整数类型,直到所有枚举常量都被看到。
推荐阅读
- anaconda - 我可以将 Spyder 接口与远程服务器一起使用吗?
- python - 如何使用python从json中正确删除数据
- javascript - 无溢出:带页脚和导航栏的全屏轮播 HTML CSS JS
- javascript - 如何在子组件中调用父函数
- javascript - 如何在传单中使用 polylinedecorator 插件?
- git - 如何从 gitlab 中的 fork 创建合并请求
- java - 无法将 BufferedImage 转换为图像 java
- scala - 将数据帧写入 HDFS 时出现 Spark OOM 问题
- reactjs - 输出一定数量后的 React Js Stop map 方法
- c# - 在方法中途添加泛型类型约束