linux kernel中typeof和container_of的理解

时间:2023-01-26 16:05:16

1.typeof引入原因

#define min(x,y) ((x) > (y) ? (y) : (x))

如果min(x++ , y++),这个宏定义就会有问题


#define min(X,Y)  \
(__extension__  \
({  \
   typeof(X) __x=(X), __y=(Y);   \
   (__x<__y)?__x:__y;  \
}) \

此时linux kernel引入了typeof,即取变量的定义。

2.container_of

1> Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。
2>接口:
container_of(ptr, type, member) 
ptr:表示结构体中member的地址
type:表示结构体类型
member:表示结构体中的成员
通过ptr的地址可以返回结构体的首地址

举例说明

struct student{

...

list_head list

};

list_head *now_list;

container_of(nowlist,struct student, list) ;

此时通过container_of就得到了nowlist对应的student的首地址。

经常用于链表操作