Linxu內(nèi)核中宏container_of的作用是根據(jù)結(jié)構(gòu)體成員的一個指針地址來獲取整個結(jié)構(gòu)體的地址,要想理解container_of,我們先來看看宏offtof
我們先來看看宏offtof
在Linux內(nèi)核中是這樣定義的:
#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H
#define offtof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
一共4步
1. ( (TYPE *)0 ) 將零轉(zhuǎn)型為TYPE類型指針;
2. ((TYPE *)0)->MEMBER 訪問結(jié)構(gòu)中的數(shù)據(jù)成員;
3. &( ( (TYPE *)0 )->MEMBER )取出數(shù)據(jù)成員的地址;
4.(size_t)(&(((TYPE*)0)->MEMBER))結(jié)果轉(zhuǎn)換類型。巧妙之處在于將0轉(zhuǎn)換成(TYPE*),結(jié)構(gòu)以內(nèi)存空間首地址0作為起始地址,則成員地址自然為偏移地址;
再來看看宏container_of
在Linux內(nèi)核中是這樣定義的:
#ifndef _LINUX_KERNEL_H
#define _LINUX_KERNEL_H
#include "stddef.h"
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offtof(type,member) );})
#endif
其中,typeof是GNU C對標(biāo)準(zhǔn)C的擴(kuò)展,它的作用是根據(jù)變量獲取變量的類型。因此,上述代碼中的第2行的作用是首先使用typeof獲取結(jié)構(gòu)體域變量member的類型為 type,然后定義了一個type指針類型的臨時變量__mptr,并將實際結(jié)構(gòu)體變量中的域變量的指針ptr的值賦給臨時變量__mptr
第三行代碼分為三步:
1.(char *)__mptr轉(zhuǎn)換為字節(jié)型指針。
2.(char *)__mptr - offtof(type,member) )用來求出結(jié)構(gòu)體起始地址(為char *型指針),
3.然后(type *)( (char *)__mptr - offtof(type,member) )在(type *)作用下進(jìn)行將字節(jié)型的結(jié)構(gòu)體起始指針轉(zhuǎn)換為type *型的結(jié)構(gòu)體起始指針。
本文發(fā)布于:2023-02-28 20:01:00,感謝您對本站的認(rèn)可!
本文鏈接:http://www.newhan.cn/zhishi/a/167764949976516.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請與我們聯(lián)系,我們將在24小時內(nèi)刪除。
本文word下載地址:offsetof(offsetof宏).doc
本文 PDF 下載地址:offsetof(offsetof宏).pdf
| 留言與評論(共有 0 條評論) |