宏定义函数container_of的解释
從kernel里面摳出的一些與宏container_of有關的代碼,如下:
1、此宏作用是從結構體的某元素(member)出發,得到結構體的首地址;
2、container_of的參數解釋
(1)type:指的是(包含member這個成員元素的結構體)所對應的類型,即(我們要獲取首地址的那個結構體)所對應的類型;
(2)member:指的是結構體中的某個元素的名字,我們就是從這個元素出發,得到結構體的首地址。注意這個元素在內核中可能也是結構體。
(3)ptr:指向結構體中member這個元素的指針。
3、offsetof的解釋
(1)格式這樣看比較明顯(->優先級比&高):#define offsetof(TYPE, MEMBER) ? ( ? ?(size_t) ? ? ?&( (TYPE *)0 )->MEMBER? ? ?)
- 首先(TYPE *)0 ,然后(TYPE *)0 ->MEMBER,接著&((TYPE *)0 ->MEMBER),最后強制類型轉換為size_t類型。
(2)進一步解釋
- 即先將0地址強制轉換為(要獲取首地址的那個)結構體的指針;
- 然后獲取元素member,進而取其地址。由于結構體的指針指向地址為0,那么元素member的地址就是member元素偏移結構體首地址的偏移量。
- 由于此時偏移量是以地址形式(就一個數字,或者說指針)呈現的,我們要把它改成int類型,所以來一個強制類型轉換。
4、container_of解釋
(1)const ? typeof( ?((type *)0)->member )* ? __mptr = (ptr)
首先獲取結構體元素member的的類型,然后定義一個指向此類型的指針_mptr,并賦值為ptr;
(2)(type *) ?( ?(char *)__mptr ? - ?offsetof(type, member) ? )
首先將_mptr強制轉化為char*類型,然后減去偏移量,最后強制轉換為結構體類型指針,即返回了結構體首地址。
這里之所以轉換為char*類型,是因為減去偏移量時,偏移量是多少,那就減去多少字節。
總結
以上是生活随笔為你收集整理的宏定义函数container_of的解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件项目需求开发过程实践之软件需求说明书
- 下一篇: 驱动的定义、分类、安全性