我正在开发一个 C 项目,该项目需要在结构中以跨平台一致的内存偏移量存储枚举值。由于 C 中的枚举存储大小可能会根据编译器和平台的不同而有所不同,因此我在确保枚举变量精确存储在 32 位中时遇到了困难。
这是我尝试过的:
typedef enum {
value1,
value2,
value3,
dummy_value = 0x7FFFFFFF // Ensures at least 32-bit range
} my_enum;
我将
dummy_value = 0x7FFFFFFF
添加到枚举中,希望这会强制编译器使用 32 位进行存储。但是,在某些平台上,编译器可能仍然为枚举分配 64 位,这会导致我的结构的内存布局不一致。
这是我的结构的样子:
typedef struct {
my_enum enum_field; // This may not always be 32 bits
int other_field;
} MyStruct;
我的目标是确保
enum_field
始终恰好占用 32 位,无论平台如何。
我尝试过的:
dummy_value
,但这并不总是强制执行 32 位存储。int32_t
作为存储类型,但我不确定这是否是以独立于平台的方式使用枚举的最佳方法。问题:
int32_t
代替 my_enum
是一个很好的做法,还是有更好的方法?任何见解或建议将不胜感激!
有没有可靠的方法来确保枚举值在 C 中精确地存储在 32 位中?
直到 C23 - 否。
从 C23 开始 - 我们有固定基础类型的枚举,所以你可以使用:
//-----------vvvvvvvvv--
typedef enum : int32_t {
value1,
value2,
value3,
} my_enum;
在结构中使用 int32_t 代替 my_enum 是一个很好的做法,还是有更好的方法?
它有缺点,因为你失去了真正枚举的优势。一般来说,我不会说这是一个好的做法。
但如果您无法使用 C23,这是可靠确保值是 32 位的唯一选择。