0

qemu ソース コードには、次の名前のマクロがありますoffsetof。誰がそれが何をするのか教えてもらえますか?

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

このように使用されます:

offsetof(CPUState, icount_decr.u32)

ここで、CPUState は構造体です。

構造体内のメンバーのオフセットが得られると思いますが、よくわかりません。

編集:ええ、私は何が起こっていたかを知りました. CPUState の定義には、変数 icount_decr を含むマクロが含まれていましたが、見逃していました。

4

3 に答える 3

3

構造体のメンバーのオフセットを取得します。これは、アドレス 0 をその型の構造体にキャストしてから、メンバーのアドレスを取得することによって行われます。

于 2010-08-10T20:22:35.437 に答える
1

あなたの考えは正しいです!また、マクロの名前も良いヒントを与えてくれます。;)

于 2010-08-10T20:20:45.687 に答える
0

それは§7.17/3で定義されています:

offsetof(type, member-designator)
size_tこれは、タイプがバイト単位のオフセットで ある整数定数式に展開され、構造体の先頭(タイプで指定)から構造体メンバー(メンバー指定子で指定)に拡張されます。タイプとメンバーの指定子は、与えられ たときに式がアドレス定数に評価されるようなものでなければなりません。(指定されたメンバーがビットフィールドの場合、動作は未定義です。)
static type t;
&(t.member-designator)

ライブラリは必ずしも言語規則に従う必要はないため、実装は自由に結果を得ることができます。

したがって、この特定の実装の結果は未定義の動作ではありません。これは、実装方法を気にする必要がないためです。(言い換えると、実装により、nullポインターを介した間接参照のアドレスの取得が明確に定義されていることが保証されます。もちろん、独自のプログラムでこれを想定することはできません。)

一部のライブラリで(再)定義されている場合offsetof、プログラムの動作が未定義になっているため、代わりに標準ライブラリを使用する必要があります。(ダミー。)

于 2010-08-10T20:27:36.207 に答える