gcc ___;打包__;无法按预期工作

gcc ___;打包__;无法按预期工作,gcc,struct,packed,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、

我经常使用这样的代码:

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)gcc4.8来看,它并没有像预期的那样工作。 sizeof(struct teststruct)将返回8

我没有发现任何提示为什么它不再有效。
或者有没有其他方法以结构化方式访问协议缓冲区?

似乎使用
-mno ms位字段编译必须有所帮助(请参阅扩展讨论)。我手头没有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;
}
#包括
#包括
结构测试结构
{
uint8_t i1;
uint16_t i2;
uint32_t i4;
}_uuu属性_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
内部主(空)
{
fprintf(stderr,“大小=%d\n”,sizeof(struct teststruct));
返回0;
}

并在linux上使用
-mms位字段编译它,因此它返回8。默认值为7。我想,
-mms位域
是windows目标的默认值。

似乎使用
-mno-ms位域
进行编译必须有所帮助(请参阅扩展讨论)。我手头没有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;
}
#包括
#包括
结构测试结构
{
uint8_t i1;
uint16_t i2;
uint32_t i4;
}_uuu属性_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
内部主(空)
{
fprintf(stderr,“大小=%d\n”,sizeof(struct teststruct));
返回0;
}
并在linux上使用
-mms位字段编译它,因此它返回8。默认值为7。我想,
-mms位域
是windows目标的默认值