[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
2022-03-13 07:10:26
質問
Linuxカーネルをブラウズしていたら
container_of
マクロは次のように定義されています。
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
container_of が何をするのかは理解できたが、理解できないのは最後の文である。
(type *)( (char *)__mptr - offsetof(type,member) );})
次のようにマクロを使用すると
container_of(dev, struct wifi_device, dev);
最後の文の対応する部分は、次のようになります。
(struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev);
というのは、何もしていないように見えます。 どなたかこの空白を埋めていただけませんか?
解決方法は?
使用例
container_of(dev, struct wifi_device, dev);
は、2つの名前空間を混在させているため、少し誤解を招く可能性があります。
一方、最初の
dev
はポインタの名前を指しており、2番目の
dev
は構造体メンバの名前を指しています。
おそらく、このミックスアップが頭痛の種になっているのでしょう。実際
member
パラメータは、コンテナ構造でそのメンバに付けられた名前を参照しています。
このコンテナを例にとると
struct container {
int some_other_data;
int this_data;
}
そしてポインタ
int *my_ptr
を追加しました。
this_data
へのポインタを取得するためにマクロを使用します。
struct container *my_container
を使うことで
struct container *my_container;
my_container = container_of(my_ptr, struct container, this_data);
のオフセットを取る。
this_data
構造体の先頭へのポインタを考慮することは、正しいポインタの位置を取得するために不可欠です。
実質的には、メンバである
this_data
ポインターから
my_ptr
をクリックすると、正しい位置が表示されます。
まさに、マクロの最終行がそうなっていますね。
関連
-
C/C++の再定義
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] ストラクチャーとユニオンの違い
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
関数 'malloc' の暗黙の宣言に対する解決策
-
[解決済み] mallocで文字列を確保する
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] C関数から文字列を返す
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] .aファイル、.soファイルとは何ですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?