問題タブ [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.
c - x マクロは、誤った offsetof() 情報を出力します
X マクロ内での offsetof() の使用における明らかなエラーに困惑しています。以下のコードは、かなり単純な構造の 2 つの例を示しています。1 つは明示的に定義され、もう 1 つは X マクロを使用して定義されています。次に、両方の構造内の各構造フィールドのオフセットが画面に出力されます。以下のコメントでわかるように、X マクロで定義された構造体のcフィールドは、正しくないオフセットを示しています。
これは印刷の問題だと思います。誰かこの謎に光を当ててくれませんか?
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 で必要なものを取得するための最良の (最も移植性の高い) 方法ですか? 具体的には:
struct(同じ型の) 異なるメンバーで動作する関数を作成する機能。- によって返された値を使用
offsetofして実際のメンバーへのポインターに変換する移植可能な方法。