問題タブ [offsetof]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
76 参照

c - x マクロは、誤った offsetof() 情報を出力します

X マクロ内での offsetof() の使用における明らかなエラーに困惑しています。以下のコードは、かなり単純な構造の 2 つの例を示しています。1 つは明示的に定義され、もう 1 つは X マクロを使用して定義されています。次に、両方の構造内の各構造フィールドのオフセットが画面に出力されます。以下のコメントでわかるように、X マクロで定義された構造体のcフィールドは、正しくないオフセットを示しています。

これは印刷の問題だと思います。誰かこの謎に光を当ててくれませんか?

0 投票する
0 に答える
295 参照

c - offsetof() を使用して、メンバーに依存しない関数のメンバーへのポインターを取得する

次のようなものがあるとしますstruct

つまり、複数のリンクされたリストに同時に存在する複数の「次の」ポインタが含まれています。「次の」ポインタをたどることができる単一の関数を書きたい場合は、必要「次の」ポインタのオフセットを渡すことができます。

wherePTR_OFFSETは、 some へのポインター、struct必要なメンバーの型 (この場合はS*)、および必要なメンバーのオフセットを指定して、そのポインターを逆参照することで、必要なメンバーの値を取得できるマクロです。

S_free_impl()オフセットを取得するには、以下を使用して呼び出すフロントエンド マクロを記述しoffsetofます。

次に、次のように使用します。

PTR_OFFSETマクロの初期実装は次のとおりです。

ただし、たとえば を使用してコンパイルするとgcc -Wcast-align、次のようになります。

警告を抑制する 1 つの方法は、C++ と同等の C を記述することですreinterpret_cast

PTR_OFFSET次に、それを使用するように書き直します。

を介してキャストするため、警告は消えuintptr_tます。


問題は、これは C で必要なものを取得するための最良の (最も移植性の高い) 方法ですか? 具体的には:

  1. struct(同じ型の) 異なるメンバーで動作する関数を作成する機能。
  2. によって返された値を使用offsetofして実際のメンバーへのポインターに変換する移植可能な方法。