当前位置: 技术问答>linux和unix
关于linux中对宏container_of(ptr, type, member)定义的疑问?
来源: 互联网 发布时间:2017-05-03
本文导语: 对于这句:(type*)( (char*)__mptr - offsetof(type,member) ); 为什么要将__mptr先转换为char*类型呢?就算不转换,__mptr为head_list型指针也可以吧?因为__mptr仅仅是一个地址,用它来做一个减法运算,并不涉及取值操作,所以...
对于这句:(type*)( (char*)__mptr - offsetof(type,member) );
为什么要将__mptr先转换为char*类型呢?就算不转换,__mptr为head_list型指针也可以吧?因为__mptr仅仅是一个地址,用它来做一个减法运算,并不涉及取值操作,所以它是什么类型并没有什么关系!但是如果涉及到用 ' * ' 解除引用进行取值操作的话,那么__mptr是什么类型就有关系了!
为什么要将__mptr先转换为char*类型呢?就算不转换,__mptr为head_list型指针也可以吧?因为__mptr仅仅是一个地址,用它来做一个减法运算,并不涉及取值操作,所以它是什么类型并没有什么关系!但是如果涉及到用 ' * ' 解除引用进行取值操作的话,那么__mptr是什么类型就有关系了!
|
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
后面这个宏算的是以字节为单位的偏移量,一个结构体中某成员相对于结构体起始地址的偏移。注意是以字节为单位。
而__mptr为struct list_head *类型。说简单点如int *pi和char* pch ,pi-1 和pch-1肯定是不一样的;向前移动的分别是sizeof(int)和sizeof(char)的大小。
后面这个宏算的是以字节为单位的偏移量,一个结构体中某成员相对于结构体起始地址的偏移。注意是以字节为单位。
而__mptr为struct list_head *类型。说简单点如int *pi和char* pch ,pi-1 和pch-1肯定是不一样的;向前移动的分别是sizeof(int)和sizeof(char)的大小。