真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C語(yǔ)言之offset_of宏和container_of宏-創(chuàng)新互聯(lián)

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

目前創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、賀蘭網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

1:offset_of宏

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

定義:

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

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

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

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

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

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

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

2:container_of宏:

container_of宏是linux內(nèi)核中常用的一個(gè)宏,用于從結(jié)構(gòu)體元素中獲取這個(gè)結(jié)構(gòu)體本質(zhì)的指針,也就是通過(guò)結(jié)構(gòu)體變量中的某個(gè)成員變量來(lái)獲取整個(gè)結(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)作用:知道一個(gè)結(jié)構(gòu)體中某個(gè)元素的指針,反推這個(gè)結(jié)構(gòu)體變量的指針。有 了container_of宏,我們可以從一個(gè)元素的指針得到整個(gè)結(jié)構(gòu)體變量的指針,繼而得到結(jié)構(gòu)體中其他元素的指針。

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

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


文章標(biāo)題:C語(yǔ)言之offset_of宏和container_of宏-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://weahome.cn/article/ddojod.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部