__packed限定符被忽略

时间:2013-11-11 20:28:20

标签: gcc android-ndk arm alignment gcc-warning

为什么我在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

2 个答案:

答案 0 :(得分:2)

GCC似乎不支持所有变量的packed属性。它仅支持structunionenum类型。所以你可以尝试这样的事情:

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属性指针用于此类用法。