這兩個(gè)是在linux內(nèi)核中經(jīng)常用到的兩個(gè)宏,先說(shuō)offsetof這個(gè)宏的作用就是來(lái)計(jì)算在結(jié)構(gòu)體中的一個(gè)元素與結(jié)構(gòu)體地址的偏移量。結(jié)構(gòu)體的元素訪問(wèn)其實(shí)就是指針訪問(wèn),直接應(yīng)用的時(shí)候是用一個(gè)點(diǎn)來(lái)訪問(wèn)的但是其實(shí)在底層經(jīng)過(guò)編譯器編譯后的執(zhí)行程序還是用這個(gè)偏移量的地址來(lái)訪問(wèn)的例如定義一個(gè)結(jié)構(gòu)體如下
typedef struct test{
char t1;
int t2;
short t3;
}test;
int main(void)
{
test s1;
s1.t1='a';
s1.t2=123;
s1.t3=456;
return 0;
}
這種用點(diǎn)的形式直接訪問(wèn)其本質(zhì)是如下的:
test p;
charp1;
int p2;
shortp3;
p=&s1;
p1=(char )((int)p+0)
p2=(int)((int)p + 4);
p3=(short *)((int)p + 8);
printf("*p1 = %c.\n",*p1);
printf("*p2 = %d.\n",*p2);
printf("*p3 = %d.\n",*p3);
這樣得到結(jié)構(gòu)是完全正確的意思就是這個(gè)偏移量很重要,所有就產(chǎn)生了offsetof這個(gè)宏,他的原型是
#define offsetof(Type,Member) ((int)&((Type*)0)->Member)
首先有兩個(gè)參數(shù)Type是指這個(gè)結(jié)構(gòu)體的類型名,member就是這個(gè)結(jié)構(gòu)體的成員名經(jīng)過(guò)這個(gè)宏之后就返回了一個(gè)×××數(shù)是這個(gè)成員變量在這個(gè)結(jié)構(gòu)體中相對(duì)于結(jié)構(gòu)體地址的偏移量這里邊有一個(gè)(Type*)0)最不好理解意思就是假設(shè)了一個(gè)type類型的結(jié)構(gòu)體他的地址是在地址0處其實(shí)這個(gè)結(jié)構(gòu)體是不存在的但是這樣假定使用是不會(huì)有問(wèn)題的,因你又沒(méi)有引用這個(gè)地址所有就沒(méi)有問(wèn)題了,其實(shí)返回的這個(gè)數(shù)就是這個(gè)成員的地址減去結(jié)構(gòu)體的地址但是因?yàn)榻Y(jié)構(gòu)體的地址是0所有就能直接返回這個(gè)成員的地址而也正因?yàn)榻Y(jié)構(gòu)體的地址是零所有成員的地址也就正好是偏移量了。
而container_of這個(gè)宏就是在offsetof這個(gè)宏的基礎(chǔ)上發(fā)展來(lái)的他的作用就是知道一個(gè)結(jié)構(gòu)體中的成員的地址通過(guò)這個(gè)宏的運(yùn)算后得到了結(jié)構(gòu)體的地址,這個(gè)就厲害了因?yàn)槟阒灰懒私Y(jié)構(gòu)體的指針那么你就可以得到結(jié)構(gòu)體中的任何一個(gè)元素。這個(gè)宏的源型是#define container_of(ptr,type,member) ({\
Const typeof(((type)0)->member) mptr = (ptr);\
(type)((char)mptr - offsetof(type,member));})
有三個(gè)參數(shù)ptr是結(jié)構(gòu)體中元素的指針,type是結(jié)構(gòu)體的類型名,member是這個(gè)ptr指針的結(jié)構(gòu)體元素名。這個(gè)宏里第一條我覺(jué)得其實(shí)也沒(méi)什么用去掉應(yīng)該也可以因?yàn)樗皇堑玫搅诉@個(gè)結(jié)構(gòu)體中成員變量的類型,之后這個(gè)成員變量的地址減去他在結(jié)構(gòu)體中的偏移量那得到的就是結(jié)構(gòu)體的指針在將類型強(qiáng)制轉(zhuǎn)換為結(jié)構(gòu)體指針就可以了。
另外有需要云服務(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)景需求。