我经常使用这样的代码:
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.
我没有找到任何暗示为什么它不再起作用。 或者是否有其他方式以结构方式访问协议缓冲区?
答案 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目标的默认值。