offsetof与container_of宏 [学习笔记]

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 *) 类型。

猜你喜欢

转载自www.cnblogs.com/nnmobi/p/10509519.html