1

offsetof()演算子を使用して構造体メンバーのオフセットを出力するために使用する小さなプログラムがあります。

問題の構造体が異なる多くのコンテキストでこのプログラムを使用するため、プロジェクトごとに (および構造体に加えた変更ごとに) コードを再プログラムする必要があります。これらの構造体 (制御構造体と状態構造体) はかなり大きくなる傾向があるため、更新には多くの時間がかかります。

私がしたいのは、offsetof()同等のものを使用できるメソッドですが、2番目のパラメーターは、ステートメントでハードコーディングするのではなく、文字列として指定されるメンバーの名前になります。

簡単にするために、構造が 32 ビット ワードの単一および配列で構成されていると仮定すると、オフセットは常に 4 の倍数になります。

また、名前文字列の代わりに、代替方法を歓迎します。

[メンバーはすべてワードサイズですが、コンパイラーがメンバー間にパディングを追加する可能性があるため、メンバーをカウントするだけでアドレスを計算することは良い解決策ではないことに注意してください。1つの回答(削除された)が示唆したように、packed属性を使用するとパディングを削除することで問題を解決できますが、構造を定義する実際のアプリケーションがメモリアクセスを最適化するためにパディングを使用する可能性があるため、これは有効な解決策ではありません]

4

1 に答える 1

4

次の形式の「シンボル テーブル」配列を作成します。

#define S struct mystruct
#define X(m) { #m, offsetof(S, m) }
static const struct table {
    const char *name;
    size_t offset;
} table[] = {
    X(member1),
    X(member2),
    /* ... */
};

次に、指定された名前を検索してテーブルをループし、オフセットを取得する関数を作成できます。同じ検索機能を使用して、構造ごとに 1 つずつ、複数のそのようなテーブルを持つことができます。メンバーが多すぎて線形検索のパフォーマンスが問題になる場合は、バイナリ検索またはハッシュを追加できます。

于 2012-11-30T21:04:43.857 に答える