#pragma pack(n)
For compatibility with Microsoft Windows compilers, GCC supports a set of #pragma directives that change the maximum alignment of members of structures (other than zero-width bit-fields), unions, and classes subsequently defined.
あー良かった。#pragm pack(1) とかは、そのままでもGCCで効くのだな。これが効かないとバイナリ操作ではエライことになる。
念のために、sizeof(TheStruct) で確認したほうがいいけど。
[追記]
確認してみた、pack(1), pack(2), pack(4) は期待通りだけど、8, 16は効かない。4までってことか。これは32ビットコンパイラだからか?と思ってtdm g++でもやったが同じ結果。まー、pack(1)が効けばいいや。
#pragma pack(1) struct Foo1 { unsigned long ul; // 4 bytes char c; // 1 byte } foo1; #pragma pack(2) struct Foo2 { unsigned long ul; // 4 bytes char c; // 1 byte } foo2; #pragma pack(4) struct Foo4 { unsigned long ul; // 4 bytes char c; // 1 byte } foo4; #pragma pack(8) struct Foo8 { unsigned long ul1; // 4 bytes unsigned long ul2; // 4 bytes char c; // 1 byte } foo8; #pragma pack(16) struct Foo16 { unsigned long ul1; // 4 bytes unsigned long ul2; // 4 bytes char c; // 1 byte } foo16; #include <stdio.h> int main() { printf("sizeof foo1 %d\n", sizeof(foo1)); // 5 printf("sizeof foo2 %d\n", sizeof(foo2)); // 6 printf("sizeof foo4 %d\n", sizeof(foo4)); // 8 printf("sizeof foo8 %d\n", sizeof(foo8)); // 12 ? printf("sizeof foo16 %d\n", sizeof(foo16)); // 12 ? }
[/追記]
[さらに追記]#pragma pack(1) と指定して、隙間無しの構造体が作れる。そのような定義の最後で、#pragma pack() として、パックの仕方をデフォルトに戻すのがお作法のようだ。必要なところだけ隙間無し構造体として、隙間が問題にならないならデフォルトが良い、ということだね。[/さらに追記]