一条晦涩难懂的C语言语句我在一个函数中看到的struct ylist_head *i;struct ylist_head *n;yaffs_Object *l;...//有这么一条语句l = ylist_entry(i,yaffs_Object,siblings);//其中siblings是结构体yaffs_Object中的成员//这条
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/14 18:46:12
一条晦涩难懂的C语言语句我在一个函数中看到的struct ylist_head *i;struct ylist_head *n;yaffs_Object *l;...//有这么一条语句l = ylist_entry(i,yaffs_Object,siblings);//其中siblings是结构体yaffs_Object中的成员//这条
一条晦涩难懂的C语言语句
我在一个函数中看到的
struct ylist_head *i;
struct ylist_head *n;
yaffs_Object *l;
...
//有这么一条语句
l = ylist_entry(i,yaffs_Object,siblings);
//其中siblings是结构体yaffs_Object中的成员
//这条语句调用的是一个宏,如下
#define ylist_entry(entry,type,member) \
((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member)))
二楼的解释得很好,但还是不太明白,我还想问,为什么要这么做呢?这么做有什么好处呢?为什么不直接将member的地址直接赋给l呢?如:l = &entry->member,希望二楼的在给予解答!
一条晦涩难懂的C语言语句我在一个函数中看到的struct ylist_head *i;struct ylist_head *n;yaffs_Object *l;...//有这么一条语句l = ylist_entry(i,yaffs_Object,siblings);//其中siblings是结构体yaffs_Object中的成员//这条
&((type *)NULL)->member
如果把0看作指向type的指针,那么 type::member的地址是这个
(unsigned long)(&((type *)NULL)->member)
把这个地址转成unsigned long ,因为指向整个对象的指针本身是0,所以这个值实际上就是member 这个成员在结构里的位置偏移量
(char*)(entry)就是为了让它在加减1的时候内存地址实际上也是加减1
(char*)(entry) - (unsigned long)(&((type *)NULL)->member)
就是从entry这个位置减去member的偏移量.
它的意义是:如果entry是指向某个type结构对象的member成员的指针,那么这个结果就是这个结构对象0偏移位置的指针,也就是指向这个对象整体的指针.
外头再加个类型转换就很容易理解了,因为里头算出来的就是指向整个对象的指针,所以也就转换成type*
总的来说,如果 entry是指向某个type类型对象的member成员的指针,这个宏可以求得指向这个对象的指针