我有一个打算使用32位存储的结构:
struct foo_t {
color_t color : 10
some_type_t some_field : 22;
}
,其中
color_t
是定义为的枚举typedef enum {
RED = 0,
// other values...
BLUE = 255
} color_t
请注意,当前
color_t
值适合8位,尽管将来我们可能会添加更多值(因此我们为color
保留了10位)在C99中,我想知道是否可以保证编译器会遵守
color
的宽度。如this question中所述,编译器可能选择将color_t
表示为字符。此时,根据C99 spec,指定的宽度似乎不正确:指定位域宽度的表达式应为整数常量表达式,其非负值不超过将省略冒号和表达式的类型的对象的宽度。
那么,如何强制
color
字段使用10位呢?请注意,如果编译器使用正则整数表示color_t
,则问题会消失,但是无法假定此行为。 最佳答案
在您的enum
定义中添加最终标签:
typedef enum {
//...
DUMMY_FORCE_WIDTH = 0xffffffffu, // INT_MAX,
} color_t;
这具有强制编译器/ ABI为您的
enum
各处提供足够的增长空间的附加好处。当然,这假定您的编译器允许
enum
作为位字段类型。它不必这样做,尽管它必须将其诊断为违反约束的行为,而不是:6.7.2.1结构和联合说明符§5(约束)
位字段的类型应为_Bool的合格或不合格版本,并带有符号
int,unsigned int或其他一些实现定义的类型。它是
实现定义了是否允许原子类型。
如果要严格遵守,请定义带符号或无符号类型的位域,而不是特殊的枚举类型。尽管如此,这仅保证了16位的长度。
关于c - 在C99中的结构内强制枚举值的宽度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24397424/