日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

宏定义函数container_of的解释

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 宏定义函数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的解释的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。