工会作为结构内的位字段

时间:2015-01-19 14:23:22

标签: c unions bit-fields

我有以下内容:

typedef enum {
green = 0;
orange = 1;
red = 2;
} color;

typedef enum {
proceed = 0;
prepare = 1;
stop = 2;
} state;

typedef union {
color a;
state b;
uint8_t reserved;
} status;

typedef struct {

u32 m : 8;
u32 n : 8;
status var : 8;
u32 res : 8;

} info;

我在定义结构变量时看到编译错误:

错误:位字段' var'有无效的类型。

我想将结构打包在4个字节内,并将枚举的并集作为位字段。这可能吗?

2 个答案:

答案 0 :(得分:2)

位字段的定义仅限于数据类型intsigned intunsigned int,但union类型为C89或{{1}标准。 Bit Field适用于C / C ++,C90

中定义了_Bool类型

答案 1 :(得分:2)

如果您已经了解所需的布局,最好尽可能直接询问。可能类似于:

typedef struct {
    uint8_t m;
    uint8_t n;
    uint8_t var;
    uint8_t res;
} info;

如果您想要特定尺寸,请使用显式尺寸的类型。包含enum类型成员的enum类型或联合允许(至少)与int相同的大小,因此您对此特定布局的要求就是规则。