为什么我在Android NDK项目中收到'__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;
我正在使用packed属性,因为我认为从uint8_t转换为uint32_t时遇到对齐问题(参见[1])。
[1] http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15414.html
答案 0 :(得分:2)
GCC似乎不支持所有变量的packed属性。它仅支持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
的地址。您应该只使用data
或.
直接访问结构的->
成员,而不是通过指针。有关原因,请参阅this answer。
答案 1 :(得分:0)
您引用的链接用于RVDS编译器(可能是armcc),GCC不支持packed
属性指针用于此类用法。