這篇具有很好參考價(jià)值的文章主要介紹了關(guān)于函數(shù)宏offset_of 和 container_of的學(xué)習(xí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。
#define offset_of(type, member) ((unsigned int)&((type*)0)->member)
#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offset_of(type, member)))
offset_of(type, member)
用途: 用于獲取獲取結(jié)構(gòu)體某一個(gè)成員在該結(jié)構(gòu)體中的位置
參數(shù)1:type ,表示結(jié)構(gòu)體的類型
參數(shù)2:member? 表示結(jié)構(gòu)體成員
分析:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-748128.html
(unsigned int)??& (type*)0)->member? ?a.把值為0的指針強(qiáng)制轉(zhuǎn)換成該結(jié)構(gòu)體類型
b.通過(guò)該指針找到該成員
? ??c.獲取該成員相對(duì)于0 的地址偏移
d.強(qiáng)轉(zhuǎn)成整形
?
container_of(ptr, type, member)
用途: 知道結(jié)構(gòu)體中某一個(gè)成員的地址,需要獲取到整個(gè)結(jié)構(gòu)體的指針,通過(guò)該指針獲取其他成員變量的數(shù)據(jù)
參數(shù)1:ptr,某一個(gè)成員的地址
參數(shù)2:type? 結(jié)構(gòu)體類型
參數(shù)3:member 該成員的名字?
分析:
(type *)((char *)(ptr) - offset_of(type, member))
? ??a.獲取該成員相對(duì)于結(jié)構(gòu)體指針的偏移文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-748128.html
b.將該成員的地址轉(zhuǎn)換成char*類型,該指針指向1byte的數(shù)據(jù)
? ??c.轉(zhuǎn)換成結(jié)構(gòu)體類型的指針
d.使用該結(jié)構(gòu)體成員的指針 - 該成員相對(duì)于結(jié)構(gòu)體指針的偏移 = 結(jié)構(gòu)體指針
?
?
注意事項(xiàng):
使用gcc編譯的時(shí)候有遇到此問(wèn)題:warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
這是一個(gè)編譯器警告,指示在某一行代碼中進(jìn)行了從指針到整數(shù)的類型轉(zhuǎn)換,而且這兩者的大小不同。
?(unsigned int)??& (type*)0)->member 中,由于我是在32位單片機(jī)中使用,所以u(píng)nsigned int與地址長(zhǎng)度相同。
如果在其他不同的系統(tǒng)中需注意該指針的強(qiáng)制轉(zhuǎn)換問(wèn)題,可以使用uintptr_t來(lái)解決跨平臺(tái)的問(wèn)題。
該類型定義在c庫(kù)<stdint.h>中
?
到了這里,關(guān)于關(guān)于函數(shù)宏offset_of 和 container_of的學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!
本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!