我在海湾合作委员会误解了__attribute __((打包))吗?

时间:2015-01-08 11:40:44

标签: c gcc struct

我正在尝试以下方法,在win32上使用gcc。

#include <stdio.h>

struct st { char c; int x; } __attribute__ ((packed));

int main() {
    printf("%d\n", sizeof(struct st));
    return 0;
}

我希望打印值为5,但它是8。

然而,有了以下内容,我得到了5。

#include <stdio.h>

#pragma pack(1)
struct st { char c; int x; };

int main() {
    printf("%d\n", sizeof(struct st));
    return 0;
}

我的程序肯定有问题,但我看不清楚。 我已经阅读了gcc's manual以及有关此问题的几个问题,我仍然感到困惑。任何提示?

同样从SO的这些问题的答案,我明白我不应该使用marshalling的打包结构,我可能不会使用它,但我仍然想了解我是什么无法在如此短的节目中看到。

注意:gcc-4.9.2和gcc-4.8.4都会出现问题。

2 个答案:

答案 0 :(得分:2)

你的属性位置错误 - 试试这个:

struct st { char c;
            int x __attribute__ ((packed));
          };

根据gcc手册中的示例,这将导致x被打包,使其紧跟c

当然,你不应该首先这样做,因为你的代码会破坏某些架构,即使它没有中断,也可能会有性能损失。

答案 1 :(得分:0)

在我的环境中正常工作Centos 5.11(64位) 为你提到的第一个案例打印5个。

gcc版本4.9.1(GCC)

  

gcc file.c

./a.out 
  

5