web-dev-qa-db-ja.com

C / C ++構造のオフセット

構造体のインスタンスを割り当てずに、構造体内のフィールドのオフセットを教えてくれるコードを探しています。

IE:与えられた

struct mstct {
    int myfield;
    int myfield2;
};

私は書くことができます:

mstct thing;
printf("offset %lu\n", (unsigned long)(&thing.myfield2 - &thing));

そして、出力用にoffset 4を取得します。そのmstct thing宣言/割り当てなしでどうすればよいですか?

&<struct>が構造体の最初のフィールドの最初のバイトを常に指すとは限らないことは知っています。後で説明できます。

36
davenpcj

標準のoffsetof()マクロ(stddef.h内)はどうですか?

編集:なんらかの理由でoffsetof()マクロを使用できない可能性がある場合は、次のようなものを使用して効果を得ることができます:

#define OFFSETOF(type, field)    ((unsigned long) &(((type *) 0)->field))
71
Michael Burr

右、offsetofマクロを使用します。これは(少なくともGNU CCで))CおよびC++コードの両方で使用できます。

offsetof(struct mstct, myfield2)
9
Dan Lenski

printf( "オフセット:%d\n"、&((mstct *)0)-> myfield2);

3
Frank Krueger