Knnnug がコメントで述べているように、BMP 形式は C 構造体型と互換性を持つように設計されています。ACコンパイラは、任意の2つの構造体メンバーの間または最後のメンバーの後に、好きな理由で好きなだけパディングを自由に挿入できますが、実際には、コンパイラはアライメントに必要な場所にのみパディングを挿入します。プラットフォーム用に書かれた ABI に。
offsetof
マクロとsizeof
演算子を使用してをテストできますが、構造体型のレイアウトを指定することはできません。目的にはおそらく十分です。
たとえば、32 ビットの符号なし整数、16 ビットの符号なし整数、および 2 つの 8 ビットの符号なし整数で構成される外部から課されたレイアウトに準拠する構造体が必要な場合は、この順序で合計 64 ビットが割り当てられます。次のように書くことができます:
#include <stdint.h>
#include <stddef.h>
#include <assert.h>
struct s {
uint32_t a;
uint16_t b;
uint8_t c;
uint8_t d;
};
void test_layout(void) {
assert(offsetof(struct s, a) == 0);
assert(offsetof(struct s, b) == 4);
assert(offsetof(struct s, c) == 6);
assert(offsetof(struct s, d) == 7);
assert(sizeof (struct s) == 8);
}
test_layout()
プログラムの開始時に関数を呼び出します。プログラムがそれを生き延びれば、レイアウトが正しいと確信できます。
まあ、ほぼ -- バイト順のテストは演習として残されています。