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

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

#include  struct st { char c; int x; } __attribute__ ((packed)); int main() { printf("%d\n", sizeof(struct st)); return 0; } 

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

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

 #include  #pragma pack(1) struct st { char c; int x; }; int main() { printf("%d\n", sizeof(struct st)); return 0; } 

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

同样从SO的这些问题的答案,我明白我不应该使用打包的结构进行编组 ,我可能不会使用它太多,但我仍然想了解我在这样的情况下无法看到的内容。短节目。

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

您将属性放在错误的位置 – 试试这个:

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

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

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

在我的环境中工作正常Centos 5.11(64位)为您提到的第一种情况打印5。

gcc版本4.9.1(GCC)

gcc file.c

 ./a.out