問題タブ [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
して実際のメンバーへのポインターに変換する移植可能な方法。