1

我有以下代码:

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),它返回 3。是否有可能以某种方式指示 gcc 跨匿名结构合并位域,以便sizeof(S)返回 2。

4

1 回答 1

3

您正在寻找的结果可以通过制作结构union来获得,两个位域重叠。第一个位域“使用”的位将在第二个位域中标记为“保留”:

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;
    };
};

演示

于 2022-02-22T19:50:49.087 回答