gcc __packed__无法按预期工作

时间:2013-09-05 21:16:08

标签: gcc struct packed

我经常使用这样的代码:

struct teststruct
{
    uint8_t i1;
    uint16_t i2;
    uint32_t i4;
} __attribute__((__packed__));
struct teststruct *protocol = (struct teststruct *)buffer;
uint16_t var = protocol->i2;

为了通过结构访问协议数据。

该代码适用于AVR gcc 4.6,4.7和Win32 4.6,4.7和Linux 4.6 但是现在从(MingW)gcc 4.8它没有按预期工作。 sizeof(struct teststruct)将返回8.

我没有找到任何暗示为什么它不再起作用。 或者是否有其他方式以结构方式访问协议缓冲区?

1 个答案:

答案 0 :(得分:1)

似乎使用-mno-ms-bitfields进行编译必须有所帮助(请参阅扩展讨论on the GCC bugzilla)。我手边没有任何东西,但我创造了简单的再现:

#include <stdint.h>
#include <stdio.h>

struct teststruct
{
    uint8_t i1;
    uint16_t i2;
    uint32_t i4;
} __attribute__((__packed__));

int main(void)
{
  fprintf(stderr, "size = %d\n", sizeof(struct teststruct));
  return 0;
}

并使用-mms-bitfields在linux上编译它,因此它返回8.默认值为7.我想,-mms-bitfields是Windows目标的默认值。