您好,登錄后才能下訂單哦!
在linux 驅(qū)動(dòng)源碼中,有兩個(gè)很有意思的宏,分別是offsetof和container_of,他們的作用和定義是這樣子的
offsetof 獲得結(jié)構(gòu)體某成員相對(duì)于結(jié)構(gòu)體的偏移長(zhǎng)度
/**
* 計(jì)算的結(jié)構(gòu)體中某成員的偏移量
*/
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
這個(gè)實(shí)現(xiàn)很巧妙,相當(dāng)于設(shè)結(jié)構(gòu)體的整體地址設(shè)成0,然后它的成員的地址就相當(dāng)于成員的偏移
測(cè)試代碼:
#include <stdio.h>
#include "list.h"
typedef struct Test_struct
{
char ca;
int ib;
double dc;
}Test_struct_t;
int main()
{
printf("offset ca is %d\n",offsetof(Test_struct_t,ca));
printf("offset ib is %d\n",offsetof(Test_struct_t,ib));
printf("offset dc is %d\n",offsetof(Test_struct_t,dc));
return 0;
}
執(zhí)行結(jié)果:
offset ca is 0
offset ib is 4
offset dc is 8
2.container_of 是通過(guò)結(jié)構(gòu)體的某成員的地址得到整個(gè)結(jié)構(gòu)體的地址,在使用上進(jìn)而可以訪問(wèn)到結(jié)構(gòu)體的其余成員
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
* 通過(guò)結(jié)構(gòu)體中的某個(gè)成員的指針,反推出來(lái)結(jié)構(gòu)體的指針,可以進(jìn)而可以訪問(wèn)其他成員
*/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
實(shí)現(xiàn)上實(shí)際就是當(dāng)前這個(gè)成員的地址 減去 這個(gè)成員相對(duì)整個(gè)結(jié)構(gòu)體的的偏移量,就是結(jié)構(gòu)體的地址
測(cè)試代碼
typedef struct person
{
char name[20];
char phone_num[12];
int index;
}Person_t;
void showInfo(Person_t *ptr)
{
printf("name :%s\n",ptr->name);
printf("phone_num :%s\n",ptr->phone_num);
printf("index :%d\n",ptr->index);
}
// 通過(guò)姓名打印所以信息
void getInfoByName(char name[])
{
if(!name)
return ;
Person_t *ptr = container_of(name,Person_t,name);
if(ptr)
{
showInfo(ptr);
}
}
int main()
{
Person_t person;
memset(&person,0x0,sizeof(Person_t));
person.index = 110;
strncpy(person.name,"zhangsan",strlen("zhangsan"));
strncpy(person.phone_num,"15617274954",strlen("15617274954"));
showInfo(&person);
printf("\============\n");
getInfoByName(&person.name);
return 0;
}
執(zhí)行結(jié)果
name :zhangsan
phone_num :15617274954
index :110
\============
name :zhangsan
phone_num :15617274954
index :110
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。