【问题标题】:unions as bit fields inside structures联合作为结构内的位字段
【发布时间】:2015-01-19 14:23:21
【问题描述】:

我有以下几点:

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 个字节内,并将枚举的并集作为位字段。这可能吗?

【问题讨论】:

  • 位域必须是整数类型(不是联合)
  • 你在用struct var : 8;做什么?
  • 好的,所以你是说我每次想引用它的成员时都使用“u32 var : 8”并将它的类型转换为枚举?这是唯一的方法吗?

标签: c unions bit-fields


【解决方案1】:

位字段被定义并仅限于数据类型intsigned intunsigned int,但根据C89C90 标准对union 类型不适用。 Bit Field,同时适用于 C/C++,_Bool 类型在 C99 中定义

【讨论】:

  • 好的,所以你是说我每次想引用它的成员时都使用“u32 var : 8”并将它的类型转换为枚举?这是唯一的方法吗?
【解决方案2】:

如果您已经知道想要的布局,最好尽可能直接询问。大概是这样的:

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

如果您想要特定大小,请使用明确大小的类型。 enum 类型或包含 enum 类型成员的联合允许(至少)与 int 大小相同,因此您对这种特定布局的渴望会排除这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多