6

Linuxのstddef.hは次のように定義しoffsetof()ています。

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

一方、ウィキペディアの記事offsetof()http://en.wikipedia.org/wiki/Offsetof)では、次のように定義されています。

#define offsetof(st, m) \
    ((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))

(char *)0なぜウィキペディアバージョンで減算するのですか?それが実際に違いを生むケースはありますか?

4

2 に答える 2

8

最初のバージョンは、ポインターをキャスト付きの整数に変換しますが、これは移植性がありません。

2番目のバージョンは、型キャストではなく整数の結果を取得するためにコンパイラーによるポインター演算に依存しているため、さまざまなコンパイラー間でより移植性があります。

ところで、私は元のコードをWikiエントリに追加したエディターでした。これはLinuxフォームでした。その後、編集者はそれをよりポータブルなバージョンに変更しました。

于 2010-04-02T20:16:32.353 に答える
4

この標準では、ビットパターン0に評価するためにNULLポインターは必要ありませんが、プラットフォーム固有の値に評価することができます。

減算を行うと、整数値に変換されたときにNULLが0になることが保証されます。

于 2010-04-02T19:23:54.303 に答える