これは の典型的な実装ですがoffsetof
、標準では義務付けられていません。
次のタイプとマクロは、標準ヘッダーで定義されています<stddef.h>
[...]
offsetof(
type
,
member-designator
)
これは、型 を持つ整数定数式に展開されます。その値は、構造体の先頭( でsize_t
指定) から構造体メンバー ( で指定) までのオフセット (バイト単位) です。型とメンバー指定子は、指定されたものでなければなりませんmember-designator
type
static
type
t;
次に、式はアドレス定数に評価されます。(指定されたメンバーがビットフィールドの場合、動作は未定義です。)&(t.
member-designator
)
PJ Plauger の "The Standard C Library" を読んで、それについての議論と、<stddef.h>
適切な言語にある可能性がある (あるべきか?) すべてのボーダーライン機能であり、特別なコンパイラ サポートが必要になる可能性があるその他の項目を参照してください。
それは歴史的な関心だけですが、私は 386/IX で初期の ANSI C コンパイラを使用しました (1990 年頃の歴史的な関心を参照してください) offsetof
。
#define offsetof(st, m) ((size_t)((char *)&((st *)(1024))->m - (char *)1024))
これはある種のコンパイラのバグでした。特に、ヘッダーがコンパイラと共に配布され、機能しなかったためです。