如何保证C中的枚举变量在不同平台上固定的32位存储?

问题描述 投票:0回答:1

我正在开发一个 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
    作为存储类型,但我不确定这是否是以独立于平台的方式使用枚举的最佳方法。

问题:

  1. 有没有可靠的方法来确保枚举值在 C 中精确地存储在 32 位中?
  2. 在结构体中使用
    int32_t
    代替
    my_enum
    是一个很好的做法,还是有更好的方法?

任何见解或建议将不胜感激!

c struct enums
1个回答
1
投票

有没有可靠的方法来确保枚举值在 C 中精确地存储在 32 位中?

直到 C23 - 否。
从 C23 开始 - 我们有固定基础类型的枚举,所以你可以使用:

//-----------vvvvvvvvv--
typedef enum : int32_t {
    value1,
    value2,
    value3,
} my_enum;

在结构中使用 int32_t 代替 my_enum 是一个很好的做法,还是有更好的方法?

它有缺点,因为你失去了真正枚举的优势。一般来说,我不会说这是一个好的做法。
但如果您无法使用 C23,这是可靠确保值是 32 位的唯一选择。

© www.soinside.com 2019 - 2024. All rights reserved.