C語言之offset_of宏和container_of宏

  通過結(jié)構(gòu)體整體變量來訪問其中各個元素,本質(zhì)上是通過指針方式來訪問的,形式上是通過.的方式來訪問的(這時候其實是編譯器幫我們自動計算了偏移量)。

創(chuàng)新互聯(lián)公司專注于華池網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供華池營銷型網(wǎng)站建設(shè),華池網(wǎng)站制作、華池網(wǎng)頁設(shè)計、華池網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造華池網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供華池網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

1:offset_of宏

作用:計算結(jié)構(gòu)體中某個元素和結(jié)構(gòu)體首地址的偏移量(其實質(zhì)是通過編譯器來幫我們計算)。

定義:

#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)

參數(shù)分析:TYPE是結(jié)構(gòu)體類型,MEMBER是結(jié)構(gòu)體中一個元素的元素名

返回值:member元素相對于整個結(jié)構(gòu)體變量的首地址的偏移量,類型是int

原理:通過虛擬一個type類型結(jié)構(gòu)體變量,然后用type.member的方式來訪問那個member元素,繼而得到member相對于整個變量首地址的偏移量。

(TYPE *)0 這是一個強(qiáng)制類型轉(zhuǎn)換,把0地址強(qiáng)制類型轉(zhuǎn)換成一個指針,這個指針指向一個TYPE類型的結(jié)構(gòu)體變量。 (實際上這個結(jié)構(gòu)體變量可能不存在,但是只要我不去解引用這個指針就不會出錯)。

((TYPE *)0)->MEMBER (TYPE *)0是一個TYPE類型結(jié)構(gòu)體變量的指針,通過指針來訪問這個結(jié)構(gòu)體變量的member元素

&((TYPE *)0)->MEMBER  等效于&(((TYPE *)0)->MEMBER),意義就是得到member元素的地址。但是因為整個結(jié)構(gòu)體變量的首地址是0,所以member元素的地址就是member元素相對于整個結(jié)構(gòu)體的偏移量

2:container_of宏:

container_of宏是linux內(nèi)核中常用的一個宏,用于從結(jié)構(gòu)體元素中獲取這個結(jié)構(gòu)體本質(zhì)的指針,也就是通過結(jié)構(gòu)體變量中的某個成員變量來獲取整個結(jié)構(gòu)體的首地址

container_of宏定義如下

#define container_of(ptr, type, member) ({      \  
   const typeof( ((type *)0)->member ) *__mptr = (ptr);    \  
   (type *)( (char *)__mptr - offsetof(type,member) );})  

分析:

  (1)作用:知道一個結(jié)構(gòu)體中某個元素的指針,反推這個結(jié)構(gòu)體變量的指針。有 了container_of宏,我們可以從一個元素的指針得到整個結(jié)構(gòu)體變量的指針,繼而得到結(jié)構(gòu)體中其他元素的指針。

  (2)typeof關(guān)鍵字的作用是:typepof(a)時由變量a得到a的類型,typeof就是由變量名得到變量數(shù)據(jù)類型的。

  (3)這個宏的工作原理:先用typeof得到member元素的類型定義成一個指針,然后用這個指針減去該元素相對于整個結(jié)構(gòu)體變量的偏移量(偏移量用offsetof宏得到的),減去之后得到的就是整個結(jié)構(gòu)體變量的首地址了,再把這個地址強(qiáng)制類型轉(zhuǎn)換為type *即可。

名稱欄目:C語言之offset_of宏和container_of宏
當(dāng)前URL:http://bm7419.com/article48/jdjchp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、建站公司、做網(wǎng)站、響應(yīng)式網(wǎng)站動態(tài)網(wǎng)站、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計