我有一个打算使用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/

10-12 14:28
查看更多