1

我经常使用这样的代码:

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。

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

4

1 回答 1

1

似乎编译必须有帮助(请参阅关于 GCC bugzilla 的-mno-ms-bitfields扩展讨论)。我手头没有 mingw,但我创建了简单的复制:

#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;
}

并在 linux 上用 编译它-mms-bitfields,所以它返回 8。默认值为 7。我想,-mms-bitfields是 windows 目标的默认值。

于 2013-09-06T12:03:30.220 回答