在struct中强制联合对齐

时间:2015-04-03 08:22:46

标签: c gcc struct embedded pic

如何在里面用 union 定义 struct ,以便它只占用1个字节?我试图在任何地方添加__attribute__((packed)),但它没有帮助。

以下是struct的成员:

struct
{
    int blockNumber: 1 __attribute__((packed));
    int shallBe1: 1 __attribute__((packed)); // should be set to 1 per ISO 14443-4
    int nadFollowing: 1 __attribute__((packed)); // always 0 in our software
    int cidFollowing: 1 __attribute__((packed)); // always 0 in our software
    union
    {
        int chaining: 2 __attribute__((packed)); // i-block
        int ackNak: 2 __attribute__((packed)); // r-block
        int deselectOrWtx: 2 __attribute__((packed)); // s-block
    } __attribute__((packed));
    int blockType: 2 __attribute__((packed));
} pcb __attribute__((packed));

sizeof(pcb)返回超过1,而我需要它只占用一个字节。

以下是我测试结构大小的方法:

BYTE testpcb[sizeof(pcb) == 1 ? 0 : -1];

如果我在构建期间遇到错误,那么struct不是1个字节。

1 个答案:

答案 0 :(得分:1)

每个编译器对位域的处理方式都不同,并非所有编译器都有明确定义的方法来控制如何打包位域。使用位域时,获取结构偏移量以便按照您想要的方式进行打包可能很困难,而且有时只是直接进行。

如果我是你,我会把它视为u8并在需要时适当掩盖。这是非理想的,但根据我的经验,你在这里使用的是什么。