Игнорирование примечания: смещение упакованного битового поля без использования "-Wno-pack-bitfield-compat"

У меня появляется это предупреждение, когда я пытаюсь скомпилировать следующее объединение: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 так как я хочу, чтобы это предупреждение игнорировалось только для двух из моих восьми союзов?

1 ответ

Просто столкнулся с аналогичной проблемой. Кажется, что gcc просто не любит битовые поля, которые пересекают ширину типа (как two делает в примере)?

Если вы измените все типы на uint16_tGCC принимает:

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
Другие вопросы по тегам