本文首先介绍Linux下的经典宏定义,感受极客的智慧,然后根据该经典定义为下篇博客作铺垫。
// 获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量。 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
struct student
{
char gender;
int id;
int age;
char name[20];
};
int _tmain(int argc, _TCHAR* argv[])
{
int gender_offset, id_offset, age_offset, name_offset;
gender_offset = offsetof(struct student, gender);
id_offset = offsetof(struct student, id);
age_offset = offsetof(struct student, age);
name_offset = offsetof(struct student, name);
printf("gender_offset = %d\n", gender_offset);
printf("id_offset = %d\n", id_offset);
printf("age_offset = %d\n", age_offset);
printf("name_offset = %d\n", name_offset);
system("pause");
return 0;
}
//结果:
/*
gender_offset = 0
id_offset = 4 //字节对其
age_offset = 8
name_offset = 12
*/
TYPE是结构体,它代表"整体";而MEMBER是成员,它是整体中的某一部分。
#define container_of(ptr, type, member) ({ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );})// 获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量。
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
/*根据"结构体(type)变量"中的"域成员变量(member)的指针(ptr)"来获取指向整个结构体变量的指针*/
#define addressof(PT,TYPE,MEMBER) ((TYPE *)((char *)(PT) - offsetof(TYPE,MEMBER)))
struct student
{
char gender;
int id;
int age;
char name[20];
};
void main()
{
struct student stu;
struct student *pstu;
stu.gender = '1';
stu.id = 9527;
stu.age = 24;
strcpy(stu.name, "zhouxingxing");
// 根据"id地址" 获取 "结构体的地址"。
pstu = addressof(&(stu.id), struct student, id);
// 根据获取到的结构体student的地址,访问其它成员
printf("gender= %c\n", pstu->gender);
printf("age= %d\n", pstu->age);
printf("name= %s\n", pstu->name);
}
/*结果
gender= 1
age= 24
name= zhouxingxinggender= 1
age= 24
name= zhouxingxing
*/type是结构体,它代表"整体";而member是成员,它是整体中的某一部分,而且member的地址是已知的。
最后,可以想想这个宏都有哪些用途。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/z702143700/article/details/46914995