GCC: настройки выравнивания с __attribute__ и #pragma

Как определить #pragma pack(2) как атрибут структуры?

Я читал здесь, что __attribute__((packed,aligned(4))) примерно эквивалентен #pragma pack(4) .

Однако, если я попытаюсь использовать это (по крайней мере, с 2 вместо 4), я получаю разные результаты. Пример:

 #include  #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*)&(sm) - (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.

    Как отмечено @Nominal Animal в комментариях, решение состоит в том, чтобы добавить __attribute__((__aligned__(s))) к каждому члену структуры, поскольку он может использоваться для установки выравнивания по отдельности для каждого члена.