在 C 中跨匿名结构合并位字段

merge bit fields across anonymous structs in C

我有以下代码:

typedef unsigned short u16;

struct S {
    struct {
        u16 a: 9;
        u16 b: 1;
        u16 c: 1;
        u16 d: 1;
    } __attribute__((packed));

    u16 e: 4;

} __attribute__((packed));

当我检查 sizeof(S) 时,它 returns 3. 是否有可能以某种方式指示 gcc 跨匿名结构合并位域,以便 sizeof(S) returns 2.

您要查找的结果可以通过将结构 union 改为两个 bit-fields 重叠来获得。第一个位域“使用”的位将在第二个位域中标记为“保留”:

union S {
    struct {
        u16 a: 9;
        u16 b: 1;
        u16 c: 1;
        u16 d: 1;
    } ;
    
    struct {
        u16 reserved: 12; // Number of bits used in the first struct
        u16 e: 4;
    };
};

Demo