2

为什么我'__packed__' attribute ignored [-Wattributes]在 android NDK 项目中收到警告?

这是代码

    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

4

2 回答 2

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。您应该只使用or直接访问data结构的成员,而不是通过指针。请参阅此答案以了解原因。.->

于 2017-02-24T23:38:49.030 回答
0

您引用的链接适用于 RVDS 编译器(可能是 armcc),而 GCC 不支持packed此类使用的指针属性。

于 2013-11-12T13:25:29.077 回答