当前位置: 技术问答>linux和unix
关于Linux源码中的一写语法问题?
来源: 互联网 发布时间:2015-11-03
本文导语: 小弟最近在研究Linux源代码,很多语法都不懂请各位大侠指点一下: 如: #define list_entry(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 最不明白的是那个0在其他很多源代码中也看到了很多, ...
小弟最近在研究Linux源代码,很多语法都不懂请各位大侠指点一下:
如:
#define list_entry(ptr, type, member)
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
最不明白的是那个0在其他很多源代码中也看到了很多,
请各位指点下看源代码的方法,多谢???/
如:
#define list_entry(ptr, type, member)
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
最不明白的是那个0在其他很多源代码中也看到了很多,
请各位指点下看源代码的方法,多谢???/
|
&((type *)0)->member得到的是member在结构中的相对偏移量.
|
可以看看stdio.h里面的offsetof宏,也是这么干的。
这个就是一个trick,因为仅使用指针进行算术运算而不解引用,是不会实际访问内存的。用0来干这种事情一方面是因为0是常量,第二是因为一个member相对于这个struct的偏移等于这个member的地址减去这个struct的地址,使用0的话,就不用再进行sub运算了。
这个就是一个trick,因为仅使用指针进行算术运算而不解引用,是不会实际访问内存的。用0来干这种事情一方面是因为0是常量,第二是因为一个member相对于这个struct的偏移等于这个member的地址减去这个struct的地址,使用0的话,就不用再进行sub运算了。