在C中定义枚举类型

时间:2018-02-06 17:25:19

标签: c enums typedef

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

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

5 个答案:

答案 0 :(得分:2)

不,你不能。

来自标准§6.4.4.3 C11标准N1570

  

声明为枚举常量的标识符的类型为int。

答案 1 :(得分:2)

根据§6.7.2.2 3 of the C11 Standard:

enum列表中的标识符的类型为int
  

枚举器列表中的标识符被声明为类型为int的常量,并且可能出现在允许的位置。

但是,枚举构成了不同的类型§6.2.5 16:

  

每个不同的枚举构成不同的枚举类型。

在枚举类型本身中,标准仅在§6.7.2.2 4中说:

  

每个枚举类型应与charsigned整数类型或unsigned整数类型兼容。类型的选择是实现定义的,但应能够表示枚举的所有成员的值。

此外,in a footnote指出:

  

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

因此枚举的类型是不同的,并且此类型必须与charsigned整数类型或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。当值的大小和签名很重要时,最好完全避免使用枚举。 #defineconst可用于创建类型安全的替代方案。