GCC:使用__attribute__和#pragma

时间:2017-03-31 07:51:55

标签: c gcc packing

如何将#pragma pack(2)定义为结构属性?

我读过here __attribute__((packed,aligned(4))) 大致等同于#pragma pack(4)

但是,如果我尝试使用它(至少用2而不是4),我会得到不同的结果。例如:

#include <stdio.h>

#pragma pack(push, 2)
struct test1 {
    char a;
    int b;
    short c;
    short d;
};
struct test1 t1;
#pragma pack(pop)

struct test2 {
    char a;
    int b;
    short c;
    short d;
} __attribute__((packed,aligned(2)));
struct test2 t2;


#define test(s,m) printf(#s"::"#m" @ 0x%04x\n", (unsigned int ((char*)&(s.m) - (char*)&(s)))
#define structtest(s) printf("sizeof("#s")=%lu\n", (unsigned long)(sizeof(s)))

int main(int argc, char **argv) {
    structtest(t1);
    test(t1,a);
    test(t1,b);
    test(t1,c);
    test(t1,d);

    structtest(t2);
    test(t2,a);
    test(t2,b);
    test(t2,c);
    test(t2,d);
}

输出是(在x86或x86x64上编译,Linux,gcc 4.8.4):

sizeof(t1)=10
t1::a @ 0x0000
t1::b @ 0x0002
t1::c @ 0x0006
t1::d @ 0x0008
sizeof(t2)=10
t2::a @ 0x0000
t2::b @ 0x0001
t2::c @ 0x0005
t2::d @ 0x0007

成员b,c和d的地址在两种情况下都不相同。

还有其他__attribute__我必须添加吗?我甚至无法在gcc文档中找到关于这些属性的细粒度文档。

1 个答案:

答案 0 :(得分:0)

正如@Nominal Animal在评论中指出的那样,解决方案是将__attribute__((__aligned__(s)))添加到每个结构成员,因为它可以用于为每个成员单独设置对齐。