首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略__packed限定符

忽略__packed限定符
EN

Stack Overflow用户
提问于 2013-11-11 20:28:20
回答 2查看 2.4K关注 0票数 2

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

这是代码

代码语言:javascript
复制
    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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-24 23:38:49

GCC似乎并不支持所有变量的填充属性。它只支持structunionenum类型。所以你可以试试这样的方法:

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2013-11-12 13:25:29

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19915303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档