如何将枚举类型定义为uint8而不是int?
typedef enum { R_DIRECTION_LEFT = 1, R_DIRECTION_RIGHT = 2, R_DIRECTION_TOP = 4, R_DIRECTION_BOTTOM = 8 } R_Direction;
字符串
sbtkgmzw1#
不你不能来自标准§6.4.4.3 C11标准N1570声明为枚举常量的标识符具有int类型。
ki0zmccv2#
根据C11标准的§6.7.2.2 3,enum列表中的标识符具有int类型:枚举列表中的标识符被声明为int类型的常量,并且可以出现在任何允许的地方。但是,枚举构成不同的类型§6.2.5 16:每个不同的枚举构成一个不同的枚举类型。对于枚举类型本身,标准仅在§6.7.2.2 4中规定:每个枚举类型必须与char、signed整数类型或unsigned整数类型兼容。类型的选择由实现定义,但必须能够表示枚举的所有成员的值。此外,在脚注中指出:一个实现可能会延迟选择哪个整数类型,直到所有枚举常量都被看到。因此枚举的类型是不同的,并且该类型必须与char,signed整数类型或unsigned整数类型之一兼容。将使用哪种类型由实现定义,并且在同一实现中可能因情况而异。
enum
int
char
signed
unsigned
os8fio9y3#
如果你使用GCC,你可以使用__attribute__ ((packed))来减少这种类型变量的大小。从here开始:此[ packed ]属性附加到枚举、结构或联合类型定义,指定用于表示类型的最小内存要求。由于枚举只有0到255之间的值,因此应用此属性时,它将适合单个字节。有一个相关的编译器选项:在[command]行中指定-fshort-enums标志相当于在所有enum定义中指定packed属性。
__attribute__ ((packed))
packed
-fshort-enums
pn9klfpd4#
如何将枚举类型定义为uint8而不是int?不可以。根据the C standard的6.7.2.2枚举说明符第2段:定义枚举常量值的表达式应为整数常量表达式,其值可表示为int。
ui7jx7zq5#
正如在其他答案中已经提到的,没有标准的方法来解决这个问题,因为标准规定枚举常量是int。枚举常量和变量的类型是语言中已知的主要缺陷。解决方案是只要在使用枚举常量时将其转换为uint8_t。当值的大小和有符号性很重要时,最好完全避免枚举。#define或const可以用来创建类型安全的替代方案。
uint8_t
#define
const
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语言扩展
6条答案
按热度按时间sbtkgmzw1#
不你不能
来自标准§6.4.4.3 C11标准N1570
声明为枚举常量的标识符具有int类型。
ki0zmccv2#
根据C11标准的§6.7.2.2 3,
enum
列表中的标识符具有int
类型:枚举列表中的标识符被声明为
int
类型的常量,并且可以出现在任何允许的地方。但是,枚举构成不同的类型§6.2.5 16:
每个不同的枚举构成一个不同的枚举类型。
对于枚举类型本身,标准仅在§6.7.2.2 4中规定:
每个枚举类型必须与
char
、signed
整数类型或unsigned
整数类型兼容。类型的选择由实现定义,但必须能够表示枚举的所有成员的值。此外,在脚注中指出:
一个实现可能会延迟选择哪个整数类型,直到所有枚举常量都被看到。
因此枚举的类型是不同的,并且该类型必须与
char
,signed
整数类型或unsigned
整数类型之一兼容。将使用哪种类型由实现定义,并且在同一实现中可能因情况而异。os8fio9y3#
如果你使用GCC,你可以使用
__attribute__ ((packed))
来减少这种类型变量的大小。从here开始:此[
packed
]属性附加到枚举、结构或联合类型定义,指定用于表示类型的最小内存要求。由于枚举只有0到255之间的值,因此应用此属性时,它将适合单个字节。
有一个相关的编译器选项:
在[command]行中指定
-fshort-enums
标志相当于在所有enum
定义中指定packed属性。pn9klfpd4#
如何将枚举类型定义为uint8而不是int?
不可以。根据the C standard的6.7.2.2枚举说明符第2段:
定义枚举常量值的表达式应为整数常量表达式,其值可表示为
int
。ui7jx7zq5#
正如在其他答案中已经提到的,没有标准的方法来解决这个问题,因为标准规定枚举常量是
int
。枚举常量和变量的类型是语言中已知的主要缺陷。解决方案是只要在使用枚举常量时将其转换为
uint8_t
。当值的大小和有符号性很重要时,最好完全避免枚举。#define
或const
可以用来创建类型安全的替代方案。hxzsmxv26#
C标准不支持,但clang编译器支持:
字符串
比较:https://www.ideone.com/EQj170
地址:https://www.ideone.com/7WitM8
参见:Clang语言扩展