首页 > 解决方案 > 在枚举的最后一个_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;

标签: cenums

解决方案


这没有任何意义,而且是一个错误。

我想程序员不太了解枚举是如何工作的,并认为他们可以通过为枚举常量之一分配一个大整数常量来强制枚举变为 32 位。这是真的,但他们选择了一个错误的值,它不会像他们想象的那样起作用。

问题是,虽然枚举变量可能具有实现定义的大小,但枚举常量总是_BIG_ENUM类型1 int )

0xFFFFFFFF不适合 32 位int,所以这是一个错误。十六进制常量0xFFFFFFFF实际上是类型unsigned int(假设是 32 位)并且它不适合,所以会有一个实现定义的从有符号到无符号的转换。这意味着我们最终得到了-12 的补码系统的值。尽管具有严格标准设置的 gcc 和 clang 甚至在枚举常量被赋予一个大于INT_MAX.

当遇到枚举常量 value-1时,编译器可以自由选择任何有符号类型2)用于该类型的枚举变量,不一定是 32 位变量。

_BIG_ENUM=INT_MAX,可以通过将代码更改为(limits.h)来修复代码。然后枚举类型将变为intunsigned int


1) C17 6.7.2.2/1

定义枚举常量值的表达式应为整数常量表达式,其值可表示为int.

2) C16 6.7.2.2/4

每个枚举类型应与char有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,128) 但应该能够表示枚举的所有成员的值。

128) 一个实现可能会延迟选择哪种整数类型,直到所有枚举常量都被看到。


推荐阅读