如何将枚举的类型定义为 uint8 而不是 int ?
typedef enum
{
R_DIRECTION_LEFT = 1,
R_DIRECTION_RIGHT = 2,
R_DIRECTION_TOP = 4,
R_DIRECTION_BOTTOM = 8
} R_Direction;
答案 0 :(得分:2)
答案 1 :(得分:2)
根据§6.7.2.2 3 of the C11 Standard:
,enum
列表中的标识符的类型为int
枚举器列表中的标识符被声明为类型为
int
的常量,并且可能出现在允许的位置。
但是,枚举构成了不同的类型§6.2.5 16:
每个不同的枚举构成不同的枚举类型。
在枚举类型本身中,标准仅在§6.7.2.2 4中说:
每个枚举类型应与
char
,signed
整数类型或unsigned
整数类型兼容。类型的选择是实现定义的,但应能够表示枚举的所有成员的值。
此外,in a footnote指出:
实现可能会延迟选择哪个整数类型,直到看到所有枚举常量。
因此枚举的类型是不同的,并且此类型必须与char
,signed
整数类型或unsigned
整数类型之一兼容。将使用哪些是实现定义的,并且可能因同一实现的不同情况而异。
答案 2 :(得分:0)
如何将枚举的类型定义为 uint8 而不是 int ?
你做不到。 {<3}}的 6.7.2.2枚举说明符,第2段:
定义枚举值的表达式 constant应该是一个具有值的整数常量表达式 可表示为
int
。
答案 3 :(得分:0)
如果使用GCC,则可以使用__attribute__ ((packed))
来减小此类变量的大小。来自here:
此[
packed
]属性附加到枚举,结构或联合类型定义,指定使用最小所需内存来表示类型。
由于你的枚举只有0到255之间的值,所以当应用这个属性时,它将适合单个字节。
有一个相关的编译器选项:
在[command]行上指定
-fshort-enums
标志等同于在所有enum
定义上指定packed属性。
答案 4 :(得分:0)
正如其他答案中已经提到的,没有标准的方法来解决这个问题,因为标准说枚举常量是int
。枚举常量和变量的类型是该语言中已知的主要缺陷。
解决方案只是在使用它时将枚举常量强制转换为uint8_t
。当值的大小和签名很重要时,最好完全避免使用枚举。 #define
或const
可用于创建类型安全的替代方案。