1. offsetof宏
头文件:
#include <stddef.h>
定义:
#define offsetof(type, member) (size_t)&(((type*)0)->member)
作用:
返回结构体成员 member 在 type 中的偏移位置。
宏的运行机理:
1. ( (type*)0 ) 将零转型为type类型指针;
2. ((type*)0)->member 访问结构中的数据成员;
3. &( ( (type*)0 )->member) 取出数据成员的地址;
4.(size_t)(&(((type*)0)->member)) 结果转换类型。巧妙之处在于将0转换成(type*),结构以内存空间首地址0作为起始地址,则成员地址自然为偏移地址;
2. container_of宏
头文件:
#inlude <linux/kernel.h>
定义:
#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );})
作用:
通过类型的成员和成员地址(指针)获取类型实体的地址。
宏的运行机理:
1. const typeof( ((type *)0)->member ) *__mptr = (ptr) :做类型检查,如果用typeof得到的类型和ptr的类型不一致,责编译器会报错。
2. 用__mptr减去member的偏移地址(注意,转换成char*类型),得到实体的首地址。
2. 做类型转换,转换成 (type *) 类型。