结构填料和mingw对齐

cla*_*ake 5 c arm stm32 mingw32

我在PC(mingw32,32bit arch)上模拟来自嵌入式系统(stm32,KeilμVision5,MDK-ARM)的代码.ARM编译器的对齐方式与我的桌面mingw构建不匹配:

// ARM Code (ARM compiler uses __packed)
typedef __packed struct _file
{
    uint8_t var1;
    uint16_t var2;
} FILE;

// PC mingw gcc code trying to emulate layout above.
typedef struct __attribute__((packed, aligned(1))) _file
{
    uint8_t var1;
    uint16_t var2;
} FILE;
Run Code Online (Sandbox Code Playgroud)


在源代码中,我执行以下操作:file.var1 = 0x22; file.var2 = 0xAA55;然后将其写入内存.当我读取它显示的嵌入式系统上的内存时0x22, 0x55, 0xAA.在Windows机器上读取0x22, 0xFF, 0x55, 0xAA,与在2填充第二个字节.我该如何纠正这种行为?

cla*_*ake 5

我自己修复了它 -> 使用 -mno-ms-bitfields 进行编译有帮助!上面的代码确实是正确的。有必要告诉mingw使用gcc的位域组织而不是微软的风格。虽然那时代码可能无法用微软编译器编译,但我现在不在乎。


unw*_*ind 0

根据GCC 手册的示例attribute应该位于结构体的字段之后,即:

// PC Code
typedef struct
{
    uint8_t var1;
    uint16_t var2;
} __attribute__((packed, aligned(1))) FILE;
Run Code Online (Sandbox Code Playgroud)

我还删除了无意义的结构标记 ( _file)。

上面有一个我快速测试时sizeof的值。3