8

コンパイル時に構造体のメンバーのオフセットを見つける方法はありますか? 構造体メンバーのオフセットを含む定数を作成したいと考えています。次のコードでは、offsetof()マクロは最初のprintfステートメントで機能します。ただし、10 行目で宣言するために使用するとofs、エラーが発生します。

「'->' 演算子を定数式として解決できません」.

それを行う他の方法はありますか?

struct MyStruct
{
   unsigned long lw;
   unsigned char c[5];
   int i;
   int j;
   unsigned long last;
};

const int ofs = offsetof(struct MyStruct, i);  // This line in error

int main(void)
{
   printf("Offset of c = %d.\n", offsetof(struct MyStruct, c) );
   printf("Offset of i = %d.\n", ofs );
   return 0;
}
4

3 に答える 3

10

offsetof() マクロコンパイル時の構造です。それを定義するための標準に準拠した方法はありませんが、すべてのコンパイラにはそれを行う何らかの方法が必要です。

一例は次のとおりです。

#define offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) )

技術的にはコンパイル時の構成要素ではありませんが(ユーザー "litb" によるコメントを参照)、すべてのコンパイラには、コンパイル時に解決できる式が少なくとも1 つoffsetof()必要です。これは、まさに<stddef.h で定義されているものです。 >。

コードに他のエラーがある可能性があります - <stddef.h> のインクルードが欠落している、またはコンパイラを刺激する他の何かです。

于 2009-09-04T13:44:58.483 に答える
4

適切な#includesを追加した後、g++4で警告なしにコンパイルされます。

あなたは#includestddef.hですか?offsetof()はマクロであり、Cの組み込みキーワードではありません。

それでも問題が解決しない場合は、定数を静的にして、モジュールに限定してみてください。それはコンパイラを幸せにするかもしれません。

于 2009-09-04T13:38:05.153 に答える
3

私が想定している#include <stddef.h>ように (エラーメッセージなしで引用しても意味がない) がある場合、それはコンパイラのバグです。offsetofC99 と C90 では、result は整数定数式です。

于 2009-09-04T16:55:29.443 に答える