在C中定义枚举类型

xienkqul  于 2023-11-16  发布在  其他
关注(0)|答案(6)|浏览(111)

如何将枚举类型定义为uint8而不是int

typedef enum
{
  R_DIRECTION_LEFT = 1,
  R_DIRECTION_RIGHT = 2,
  R_DIRECTION_TOP = 4,
  R_DIRECTION_BOTTOM = 8
} R_Direction;

字符串

sbtkgmzw

sbtkgmzw1#

不你不能
来自标准§6.4.4.3 C11标准N1570
声明为枚举常量的标识符具有int类型。

ki0zmccv

ki0zmccv2#

根据C11标准的§6.7.2.2 3,enum列表中的标识符具有int类型:
枚举列表中的标识符被声明为int类型的常量,并且可以出现在任何允许的地方。
但是,枚举构成不同的类型§6.2.5 16:
每个不同的枚举构成一个不同的枚举类型。
对于枚举类型本身,标准仅在§6.7.2.2 4中规定:
每个枚举类型必须与charsigned整数类型或unsigned整数类型兼容。类型的选择由实现定义,但必须能够表示枚举的所有成员的值。
此外,在脚注中指出:
一个实现可能会延迟选择哪个整数类型,直到所有枚举常量都被看到。
因此枚举的类型是不同的,并且该类型必须与charsigned整数类型或unsigned整数类型之一兼容。将使用哪种类型由实现定义,并且在同一实现中可能因情况而异。

os8fio9y

os8fio9y3#

如果你使用GCC,你可以使用__attribute__ ((packed))来减少这种类型变量的大小。从here开始:
此[ packed ]属性附加到枚举、结构或联合类型定义,指定用于表示类型的最小内存要求。
由于枚举只有0到255之间的值,因此应用此属性时,它将适合单个字节。
有一个相关的编译器选项:
在[command]行中指定-fshort-enums标志相当于在所有enum定义中指定packed属性。

pn9klfpd

pn9klfpd4#

如何将枚举类型定义为uint8而不是int
不可以。根据the C standard6.7.2.2枚举说明符第2段:
定义枚举常量值的表达式应为整数常量表达式,其值可表示为int

ui7jx7zq

ui7jx7zq5#

正如在其他答案中已经提到的,没有标准的方法来解决这个问题,因为标准规定枚举常量是int。枚举常量和变量的类型是语言中已知的主要缺陷。
解决方案是只要在使用枚举常量时将其转换为uint8_t。当值的大小和有符号性很重要时,最好完全避免枚举。#defineconst可以用来创建类型安全的替代方案。

hxzsmxv2

hxzsmxv26#

C标准不支持,但clang编译器支持:

typedef enum: uint8_t
{
  R_DIRECTION_LEFT = 1,
  R_DIRECTION_RIGHT = 2,
  R_DIRECTION_TOP = 4,
  R_DIRECTION_BOTTOM = 8
} R_Direction;

字符串
比较:https://www.ideone.com/EQj170
地址:https://www.ideone.com/7WitM8
参见:Clang语言扩展

相关问题