linux内置的两个宏:这两个宏在驱动应用中很广泛
1 off_set_of(type,memeber)
type 结构体的类型, member结构体内的成员
这个是用来计算结构体内元素的偏移量
#define off_set_of(type,memeber) \ \\接续符号
((long)&(((type *)0)->member))
1.(type *)0 指向的是结构体的0地质处
2. ((type *)0)->member 得到了结构体某个成员变量名
3. &(((type *)0)->member)) 给这个成员变量取地址(相对于零地址取地址),此时的&(((type )0)->member))是一个指针类型。
4. 将指针类型强制装换为long型(int 型可能放不下)。
将0地址强制转换为TYPE类型指针,并取得member,然后获取该member地址,最后将该地址强制转换为表示大小的整数。该整数即为该成员的偏移量。
应用实例:
注意 :S是类型 &s是指针。
2 container_of(ptr,type, member)
通过结构体的元素来推断结构体的首地址
结构体成员指针 结构体类型 结构体成员
#define container_of(ptr, type, member) \
({typeof(((type *)0)->member) *_mptr = ptr; \
(type *)((char *)_mptr-off_set_of(type, member));})
1.typeof(((type *)0)->member)得到结构体成员变量的类型
2.typeof(((type *)0)->member) *_mptr = ptr 将ptr指针的值赋予_mptr ,因此_mptr 得到了结构体成员的实际的地址
3.结构体成员实际的地址减去该成员的偏移量就可以得到结构体的首地址。
应用实例: