在阅读linux内核代码时,发现很多功能是用精简的宏定义实现的。巧妙的使用宏定义让C语言写出的代码似乎具备了C#,Java这些面向对象语言的功能,比如操作list_head(双向链表)的list_entry(p,t,m)宏,知所以需要实现这个宏是因为list_head经常是作为一些复杂数据结构的数据成员,其作用是实现这些复杂数据结构的链表。下面来看一下list_entry宏的实现:
#define list_entry(ptr, type, member) /
container_of(ptr, type, member)
#define container_of(ptr, type, member) ({ /
const typeof( ((type *)0)->member ) *__mptr = (ptr); /
(type *)( (char *)__mptr - offsetof(type,member) );})
该实现利用了C语言的结构体的内存布局性质:每一个结构体内的字段到结构体的地址都有一个固定偏移。