如何从链表获取结构体变量,从而获取该结构体的真正需求的变量,例如上面例子中的struct i2c_adapter *adap;struct device *dev
linux 通过一个巧妙的函数实现了,container_of 实现通过结构中的某个变量获取结构本身的指针 #define container_of(ptr,type,member) ( {\ ---ptr指向的是type.member类型的数据,用来推算出以ptr指向的对象作为成员的结构体的起始地址
const typeof( ((type*)0)->member ) *__mptr=(ptr);\ ---typeof 是取变量的类型,例如 int a; typeof(a) b; //typeof(a) b 等同 int b
(type*)( (char*)__mptr - offsetof(type,member) );} )
#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )
宏功能:获得一个结构体变量成员在此结构体中的偏移量。 1. ( (TYPE *)0 ) 将零转型为TYPE类型指针;
2. ((TYPE *)0)->MEMBER 访问结构中的数据成员; 3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址,即相对于0的偏移量,要的就这个;
4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型,size_t应该最终为unsigned int类型。
struct i2c_dev i2c_dev_test;
container_of(&i2c_devtest.list, struct i2c_dev, list )----通过i2c_devtest.list成员变量,返回i2c_dev_test的结构体的地址(指针)
|