当我尝试编译以下 union 时,我会弹出此警告: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,因为我希望仅对我的八个 union 中的两个 union 忽略此警告?

最佳答案

刚遇到类似的问题。看来gcc只是不喜欢跨类型宽度的位域(如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;
};

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

关于c++ - 忽略注释: offset of packed bit-field without using “-Wno-packed-bitfield-compat” ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41253759/

10-11 19:18