zoukankan      html  css  js  c++  java
  • 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
    ",sizeof(struct test));
        printf("test1:%d
    ",sizeof(struct test1));
        printf("test2:%d
    ",sizeof(struct test2));
        printf("test3:%d
    ",sizeof(struct test3));
        printf("test4:%d
    ",sizeof(struct test4));
        printf("test5:%d
    ",sizeof(struct test5));
     
        return 0;
    }

    struct test1 本以为会占用5个字节,但是使用minGW编译运行后,发现实际输出的结果如下:

    [Running] cd "c:Users isha_chenDesktopyteAlign" && gcc byte_align.c -o byte_align && "c:Users isha_chenDesktopyteAlign"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)。

  • 相关阅读:
    hashilb的使用
    包的导入/软件开发规范/异常处理
    序列化模块/模块/包
    常见模块
    可变数据类型和不可变数据类型
    python-----运算符及while循环
    Python之字符串切片
    第一、二次实训作业
    第二次JAVA作业
    Java学习心得
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/15222363.html
Copyright © 2011-2022 走看看