忽略注意:在不使用"-Wno-packed-bitfield-compat"的情况下对打包位域进行偏移

Ignoring note: offset of packed bit-field without using "-Wno-packed-bitfield-compat"

本文关键字:包位域 位域 -Wno-packed-bitfield-compat 情况下      更新时间:2023-10-16

我试图编译以下联合时会弹出此警告: 10:5: note: offset of packed bit-field 'main()::pack_it_in::<anonymous struct>::two' has changed in GCC 4.4

#pragma GCC diagnostic ignore "-Wpacked-bitfield-compat"
union pack_it_in {
    struct
    {
        uint8_t zero : 3;
        uint8_t one : 2;
        uint8_t two : 6;
        uint8_t three : 4;
        uint8_t four : 1;
    } __attribute__((packed)) u8_2;
    uint16_t u16;
};
#pragma GCC diagnostic pop

#pragma不忽略该注释。有没有办法使#pragma不需要使用-Wno-packed-bitfield-compat,因为我希望此警告仅在我的八个工会中忽略了?

只是遇到了类似的问题。似乎GCC只是不喜欢穿越类型宽度的Bitfields(如示例中two所做的那样)吗?

如果将所有类型更改为uint16_t,GCC接受:

union pack_it_in {
    struct
    {
        uint16_t zero  : 3;
        uint16_t one   : 2;
        uint16_t two   : 6;
        uint16_t three : 4;
        uint16_t four  : 1;
    } __attribute__((packed)) u8_2;
    uint16_t u16;
};

布局是您想要的,即使这些成员的类型可能不是。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpacked-bitfield-compat"
union pack_it_in {
    struct
    {
        uint8_t zero : 3;
        uint8_t one : 2;
        uint8_t two : 6;
        uint8_t three : 4;
        uint8_t four : 1;
    } __attribute__((packed)) u8_2;
    uint16_t u16;
};
#pragma GCC diagnostic pop