忽略注意:在不使用"-Wno-packed-bitfield-compat"的情况下对打包位域进行偏移
Ignoring note: offset of packed bit-field without using "-Wno-packed-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
,因为我希望此警告仅在我的八个工会中忽略了?
只是遇到了类似的问题。似乎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
相关文章:
- CreateDIBSection为同一图像返回不一致的位图位值
- 将 1 添加到 32 位的位集
- 如何将 32 位无符号整数分配给包含 32 位的位字段
- 用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
- C++中的运行时位复制(位掩码)
- 从未签名的长期错误中获得最多的32位重要位
- 如何将 32 位有符号整数放入更高的 32 位 64 位无符号整数中
- 如何在不使用外部库的情况下加载到 8 位C++位图图像
- 如何在c++中将位作为位写入文件
- 将十六进制转换为64位的位集c++
- 32位- 64位进程间通信
- 如何在c++中将16位RGBA4444位图转换为16位灰度
- 使用64位包编译32位Qt应用程序
- 如何使用大于64位的位域
- 具有非八位对齐子字段的96位长位域
- GCC 无法矢量化 64 位乘法。64 位 x 64 位 -> 128 位加宽乘法可以在 AVX2 上进行矢量化吗?
- visual c++ Windows Shell Extensions - Win7 32位- 64位兼容性问题
- c++将大于64位的位值转换为十进制
- 正确(独立于32位/64位)将浮点数保存为二进制流
- 我该如何打包和解包这个64位整数