ことがoffsetof
の典型的な実装であるが、それは単に言う標準で義務付けされていません。
次のタイプとマクロがで定義されています標準ヘッダ<stddef.h>
[...]
offsetof(
type
,
member-designator
)
size_t
型を持つ整数定数式、(によって指定その構造の先頭から 、(member-designator
によって指定される)構造部材に、バイト単位でオフセットさ の値に展開されtype
)。型部材指示 は
static
type
t;
所与次いで発現&(t.
member-designator
)
アドレス定数に評価するようなものでなければなりません。 (指定したメンバーがビットフィールドである場合、動作は未定義である。)
読むPJ Plaugerの「標準Cライブラリ」、それについての説明は、すべてのボーダーライン機能です<stddef.h>
内の他のアイテムそれは適切な言語であり、特別なコンパイラのサポートが必要な場合があります。
私は386/IX上で初期のANSI Cコンパイラを使っていましたが(私は、1990年頃の歴史的な関心事をお伝えしました)、offsetof
のバージョンでクラッシュしましたが、
ヘッダがコンパイラと一緒に配布され、機能しなかったではない、少なくともので、種類のコンパイラのバグだった
#define offsetof(st, m) ((size_t)((char *)&((st *)(1024))->m - (char *)1024))
。
これは、私がSO上で見た最初の質問ですか? : – paxdiablo
if(0){asm(nop)}を出した人が何か失敗した場合... – RBerteig
ANSI C(実際にはISO C)は、この定義を 'offsetof'に指定していません。どのように動作しなければならないかを指定するだけです。実際の定義は各実装までであり、ある実装を別の実装に変えることができます。 –