minGW: 记录windows下minGW的一个问题
如下所示:
#include <stdio.h> /*编译器默认是4字节对齐*/ struct test{ char a; int b; }; /*按实际占用的空间大小*/ struct test1{ char a; int b; }__attribute__((packed)); /*结构体大小必须4字节对齐*/ struct test2{ char a; int b; }__attribute__((aligned(4))); /*结构体大小必须8字节对齐*/ struct test3{ char a; int b; }__attribute__((aligned(8))); /*结构体大小必须16字节对齐*/ struct test4{ char a; int b; }__attribute__((aligned(16))); /*int 类型数据大小必须8字节对齐*/ struct test5{ char a; int __attribute__((aligned(8))) b; }; int main() { printf("test:%d\n",sizeof(struct test)); printf("test1:%d\n",sizeof(struct test1)); printf("test2:%d\n",sizeof(struct test2)); printf("test3:%d\n",sizeof(struct test3)); printf("test4:%d\n",sizeof(struct test4)); printf("test5:%d\n",sizeof(struct test5)); return 0; }
struct test1 本以为会占用5个字节,但是使用minGW编译运行后,发现实际输出的结果如下:
[Running] cd "c:\Users\nisha_chen\Desktop\byteAlign\" && gcc byte_align.c -o byte_align && "c:\Users\nisha_chen\Desktop\byteAlign\"byte_align
test:8
test1:8
test2:8
test3:8
test4:16
test5:16
实际占用长度为8个字节,把上述code 复制到 linux下编译运行后,提到的结果 仍为 5 个字节, 说明code本身是没有问题的。参考了一些链接,有说是minGW bug的,有说是写法有问题的。
不过看到有一个写法可能得到正确的结果:
attribute packed is broken on mingw32 compilers. Another option is to use pragma pack:
#pragma pack(1)
typedef struct _file
{
uint8_t var1;
uint16_t var2;
} FILE;
就是加上 #pragma pack(1)。