冗余__packed__属性

时间:2010-08-26 01:27:21

标签: c gcc bit-fields type-punning

此代码适用于Microchip的PIC32MX微处理器。他们的编译器基本上是GCC 3.4。

我倾向于使用GCC的__packed__ attribute将位域打包到一个联合中,然后将它们检索为unsigned char(即类型惩罚),以便通过SPI或I2C发送。这个行为都是由我的实现定义的,并且完美地运行。我更喜欢这种大约一百次遮蔽和移动:)

我的问题是:下面的代码中有__packed__个属性是多余的吗?乍一看,我认为那些顶级工会成员的人可以免除,但我不太确定。或者我可以忽略嵌套结构中的那些吗?

// Remember that bitfields cannot straddle word boundaries!
typedef struct
{
    /// Some flag #1
    unsigned FlagOne            : 1 __attribute__((packed));
    /// Some flag #2
    unsigned FlagTwo            : 1 __attribute__((packed));
    /// A chunk of data
    unsigned SomeData           : 5 __attribute__((packed));

    // and so on, maybe up to 32 bits long depending on the destination

} BlobForSomeChip;

/// This kind of type-punning is implementation defined. Read Appendix A (A7, A12) of
/// the MPLAB C Compiler for PIC32 MCUs manual.
typedef union
{
    /// Access the members of this union to set flags, etc
    BlobForSomeChip blobdata __attribute__((packed));

    /// As a byte for sending via SPI, I2C etc
    unsigned char bytes[4] __attribute__((packed));

} BlobData;

1 个答案:

答案 0 :(得分:2)

首先,我建议使用-Wall进行编译。

现在:

  1. BlobForSomeChip结构声明了7位。通常,由于对齐,它将是4个字节长,但对于打包属性,它只有1个字节长。
  2. 无法打包unsigned char[4]。它总是4个字节长,无论如何。
  3. 简而言之:

    1. struct BlobForSomeChip = 1个字节
    2. unsigned char[4] = 4个字节
    3. BlobData = 4个字节(最大成员的大小)。
    4. 总之,BlobData上的压缩属性不是必需的。如果使用,GCC将忽略它们 - 使用-Wall查看输出。