問題タブ [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 投票する
1 に答える
354 参照

c - C プログラミング、container_of() マクロを使用して値を取得する際のエラー

次のコードを作成して、offsetof() および container_of() マクロを理解しました。ここで、printf() は、同じアドレスではなく、2 つの異なるアドレスを示しています。私は何を間違っていますか?

0 投票する
3 に答える
393 参照

c - &((構造体名 *)NULL -> b) printf ステートメント内

このサンプルコードを本で見つけたのですが、printf文の式がわかりません。このプログラムは正常にコンパイルされ、出力は 4 になります。

0 投票する
6 に答える
4188 参照

c - &((struct name *)NULL -> b) は C11 で未定義の動作を引き起こしますか?

コードサンプル:

これにより、未定義の動作が発生しますか? 「null を逆参照する」かどうかは議論できますが、C11 では「逆参照」という用語は定義されていません。

6.5.3.2/4 は*、null ポインターで使用すると未定義の動作が発生することを明確に示しています。ただし、 for と同じことを言っておらず、 beingと->定義していません。演算子ごとに個別の定義があります。a -> b(*a).b

->6.5.2.3/4のセマンティクスは次のように述べています。

-> 演算子と識別子が後に続く後置式は、構造体または共用体オブジェクトのメンバーを指定します。値は、最初の式が指すオブジェクトの名前付きメンバーの値であり、左辺値です。

ただし、NULLオブジェクトを指していないため、2 番目の文は指定不足のようです。

6.5.3.2/1 も関連する可能性があります。

制約:

単項演算子のオペランドは&、関数指定子、 単項演算子[]または単項演算*子の結果、またはビット フィールドではなく、レジスタ ストレージ クラス指定子で宣言されていないオブジェクトを指定する左辺値のいずれかでなければなりません。

ただし、太字のテキストには欠陥があり、6.3.2.1/1 ( lvalueの定義) に従って、オブジェクトを指定する可能性のある lvalue を読み取る必要があると思います- C99 は lvalue の定義をめちゃくちゃにしたため、C11 はそれを書き直さなければなりませんでした。セクションが抜けました。

6.3.2.1/1 は言う:

左辺値は、潜在的にオブジェクトを指定する (void 以外のオブジェクト型を持つ) 式です。左辺値が評価時にオブジェクトを指定しない場合、動作は未定義です

ただし、&演​​算子そのオペランドを評価します。(保存された値にはアクセスしませんが、それは異なります)。

この長い一連の推論は、コードが UB を引き起こしていることを示唆しているように見えますが、それはかなり希薄であり、標準の作成者が何を意図したかは私には明らかではありません。実際に彼らが何かを意図していた場合、私たちに議論を任せるのではなく:)

0 投票する
1 に答える
72 参照

c - カスタム マクロ内での offsetof マクロの使用

次のように、自分の別のマクロ内で offsetof マクロを使用しようとしています。

カスタム マクロを使用すると、コンパイラは「メンバー」が宣言されていないと文句を言います。構造体のメンバー名を解析してマクロにする特別な方法はありますか?

Microchip 社の XC32 コンパイラを使用しています。

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

visual-studio - offsetof() の Visual Studio 構文エラー

タイプがあります:

しかし、次をコンパイルしようとすると:

Visual Studio は次のように応答します。

ここで何が問題なのですか?

私は使っている:

offsetofマクロは次のように定義されて<stddef.h>います。

消去法で。コンパイラが以下を使用することを確認しました。

0 投票する
1 に答える
397 参照

c++ - ブースト フュージョン タイプのオフセット

私は現在、ブーストフュージョン適応構造でデータメンバーのオフセットを計算しようとしていますが、そうするエレガントな方法があるかどうかはわかりません。次のようなことをしたいと思います。

ポイントは、offsetof 関数で明示的に 'a' または 'b' または 'c' を指定する必要がないことです。これ自体はそれほど有用ではありませんが、ブースト for_each ループで使用して、コンパイル時に構造体のすべてのデータ メンバーのオフセットを計算できるようにしたいと考えています。

何かアイデアがありましたら、ぜひお聞かせください。