2011-08-24 16 views
5

私は、offsetof()のパラメータラインをmystruct1にします。私はどのように構造体に対してoffsetof()を使用しますか?

offsetof(struct mystruct1, rec.structPtr1.u_line.line) 

とも

offsetof(struct mystruct1, line) 

どちらも作品を試してみました。あなたのstruct mystruct1

union { 
    struct mystruct1 structPtr1; 
    struct mystruct2 structPtr2; 
} rec; 

typedef struct mystruct1 { 
    union { 
     struct { 
      short len; 
      char buf[2]; 
     } line; 

     struct { 
      short len; 
     } logo; 

    } u_line; 
}; 
+0

構造定義のためのコンパイル可能なコードを私たちに提供できませんか?または、 'struct mystruct2'を省略します... –

+0

"どちらもうまくいかない "とはどういう意味ですか? –

答えて

7

を見ることができます。 C99標準では(§7.17<stddef.h>に)言う:

size_t型を持つ整数定数式、(によって指定された構造体に、バイト単位でオフセットさ の値に展開さ
offsetof(type, member-designator) 

メンバー指定子)、 (構造体の指定から)。型部材指示 は

static type t; 

与え、次いで式&(t.member-designator)アドレス定数に評価するようなものでなければなりません。だから、

、次のように記述する必要があります。

offsetof(struct mystruct1, u_line.line); 

mystruct1は(とのみ)最初のメンバーとしてunionが含まれている、とのline一部しかし、我々は答えはゼロになることを観察することができます。それはオフセットの0になるでしょう。

+0

それは素晴らしい、素晴らしい説明を働いてくれてありがとう! – ken

0

u_lineという名前の1人のメンバーを持っています。あなたはoffsetof()マクロは二つの引数を取り、あなたがそれぞれの「親子関係のレベルを」指定した場合

ラインダウン

offsetof(struct mystruct1, u_line); // should be 0 

またはメンバーのメンバーのオフセット

offsetof(struct mystruct1, u_line.line); 
offsetof(struct mystruct1, u_line.line.buf); 
offsetof(struct mystruct1, u_line.logo); 
0

最初に、AFAIK、offsetofは、構造体の即時メンバーだけで使用することを意図しています(私はこれについて正しいですか?)。第二に

、私はこれは動作するはず

offsetof(struct mystruct1, u_line.line) 

をしようと提案することができます人気のoffsetof実装の内部の詳細を知っています。標準に準拠しているかどうかは私には未解決の問題です。

P.S. @ジョナサン・レフラーの答えで判断すると、実際にはうまくいくはずです。

+0

「私はこれについて正しいのですか?」私はそうは思わない(gccをテストした後)。 gccは 'offsetof'式の"深い "メンバーを受け入れます。 – pmg

+1

@pmg:まあ、このような質問は、「テストする」とは本当に答えられません。 – AnT

+0

右@Andrey。ジョナサンの答えに載っているスタンダードからの引用は、 "深い"メンバーとの 'offsetof'の使用を許しています。 – pmg

2

これで読むための素晴らしい記事です:

記事で説明したように、私は一緒に修正SIZEOFマクロで、私の埋め込みコードで頻繁にoffsetofはマクロを使用

Learn a new trick with the offsetof() macro

関連する問題