为什么我在android项目中会收到'__packed__' attribute ignored [-Wattributes]警告?
这是代码
mem_ = malloc(size_);
uint8_t* ui8_ptr = reinterpret_cast<uint8_t*>(mem_);
*ui8_ptr++ = packet_version;
//uint32_t* ui32_ptr = reinterpret_cast<uint32_t*>(ui8_ptr);
__packed uint32_t* ui32_ptr = (__packed uint32_t*)(ui8_ptr);
*ui32_ptr++ = size_;
*ui32_ptr++ = flags;我使用打包属性,因为我认为在从uint8_t转换到uint32_t时存在对齐问题(参见1)。
1
发布于 2017-02-24 23:38:49
GCC似乎并不支持所有变量的填充属性。它只支持struct、union和enum类型。所以你可以试试这样的方法:
mem_ = malloc(size_);
uint8_t* ui8_ptr = reinterpret_cast<uint8_t*>(mem_);
*ui8_ptr++ = packet_version;
struct unaligned32_t
{
uint32_t data __attribute__((packed, aligned(1)));
};
//unaligned32_t* ui32_ptr = reinterpret_cast<unaligned32_t*>(ui8_ptr);
unaligned32_t* ui32_ptr = (unaligned32_t*)(ui8_ptr);
(ui32_ptr++)->data = size_;
(ui32_ptr++)->data = flags;这将不会产生警告,除非您在char类型上使用它,该类型无论如何已经是字节对齐的。
我仍在调查这是否会产生我在ARM微控制器上所针对的代码,但这是我能想到的使用打包属性的唯一合法方法。
这里是龙!不要取unaligned32_t.data的地址。您应该只使用.或->直接访问结构的->成员,而不是通过指针访问。有关原因,请参见this answer。
发布于 2013-11-12 13:25:29
您所引用的链接用于RVDS编译器(可能是armcc),GCC不支持指针上的packed属性。
https://stackoverflow.com/questions/19915303
复制相似问题