長風(fēng)秋雁
2019-11-26 12:50:53
當(dāng)我瀏覽Linux內(nèi)核時,我發(fā)現(xiàn)了一個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);最后一句話的相應(yīng)部分是:(struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev);看起來什么也沒做。有人可以在這里填補空白嗎?
3 回答

繁星點點滴滴
TA貢獻1803條經(jīng)驗 獲得超3個贊
最后一句話:
(type *)(...)
指向給定的指針type。指針計算為相對于給定指針的偏移量dev:
( (char *)__mptr - offsetof(type,member) )
使用cointainer_of宏時,您想要檢索包含給定字段的指針的結(jié)構(gòu)。例如:
struct numbers {
int one;
int two;
int three;
} n;
int *ptr = &n.two;
struct numbers *n_ptr;
n_ptr = container_of(ptr, struct numbers, two);
您有一個指向結(jié)構(gòu)中間的指針(并且您知道這是指向已歸檔的two[ 結(jié)構(gòu)中的字段名稱 ] 的指針),但是您想檢索整個結(jié)構(gòu)(numbers)。因此,您可以計算two結(jié)構(gòu)中字段的偏移量:
offsetof(type,member)
并從給定的指針中減去此偏移量。結(jié)果是指向結(jié)構(gòu)開始的指針。最后,將此指針轉(zhuǎn)換為結(jié)構(gòu)類型以具有有效變量。
添加回答
舉報
0/150
提交
取消