当前位置: 技术问答>linux和unix
这个代码不太懂,大虾们刚忙了
来源: 互联网 发布时间:2016-08-05
本文导语: #define ylist_entry(entry, type, member) ((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member))) obj = ylist_entry(lh, yaffs_Object, hashLink); yaffs_Object,hashLink都是结构体。 上面那个代码帮我解释一下。谢谢。 我只是被那么...
#define ylist_entry(entry, type, member)
((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member)))
obj = ylist_entry(lh, yaffs_Object, hashLink);
yaffs_Object,hashLink都是结构体。
上面那个代码帮我解释一下。谢谢。 我只是被那么多括号弄晕了。 结构体里面的具体内容可以不关注。
((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member)))
obj = ylist_entry(lh, yaffs_Object, hashLink);
yaffs_Object,hashLink都是结构体。
上面那个代码帮我解释一下。谢谢。 我只是被那么多括号弄晕了。 结构体里面的具体内容可以不关注。
|
lh是一个指向yaffs_object结构体变量的成员hashLink的指针。
&((type *)NULL)->member))
NULL作为type的指针,那么&((type *)NULL)->member))之际就是member在type结构体内部的偏移量。
然后把它转换为unsigned long.
entry是指向member的指针,那么entry减去member的偏移量,最后的结果就是这个结构体的入口地址,
即是这个结构体的指针。
那么结合你的例子,就是这样的:
lh是指向yaff_object结构体变量的中member成员的指针。
先找到hashLink在结构体yaffs_object变量内部的偏移量,
然后用lh这个指针的值减去member在内部的偏移量,就是yaffs_object结构体变量的地址。
说白了,就是这个道理:通过一个成员指针,来过的包含这个成员的结构体变量这个容器的指针。
用C++的思想来说,就是通过一个对象的成员的指针,来获得这个对象的地址。
&((type *)NULL)->member))
NULL作为type的指针,那么&((type *)NULL)->member))之际就是member在type结构体内部的偏移量。
然后把它转换为unsigned long.
entry是指向member的指针,那么entry减去member的偏移量,最后的结果就是这个结构体的入口地址,
即是这个结构体的指针。
那么结合你的例子,就是这样的:
lh是指向yaff_object结构体变量的中member成员的指针。
先找到hashLink在结构体yaffs_object变量内部的偏移量,
然后用lh这个指针的值减去member在内部的偏移量,就是yaffs_object结构体变量的地址。
说白了,就是这个道理:通过一个成员指针,来过的包含这个成员的结构体变量这个容器的指针。
用C++的思想来说,就是通过一个对象的成员的指针,来获得这个对象的地址。