当前位置: 技术问答>linux和unix
container_of宏实现中的两个问题
来源: 互联网 发布时间:2017-04-21
本文导语: #define container_of(ptr, type, member) ({ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );}) 为什么不直接把ptr减去偏移量?为...
#define container_of(ptr, type, member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
为什么不直接把ptr减去偏移量?为什么减去偏移量时对__mptr进行(char*)转换?
网上资料大多说的是0的强制转换问题,对于上面两个问题我还没明白。多谢!
|
第一个问题,是因为内核改进,防止程序错误加的一个编译保险措施。当用错的时候编译会告警,你会发现删除也没事。
第二个问题,char *表示编译按byte来算,必须的。不然+-法算的距离就没谱了。
第二个问题,char *表示编译按byte来算,必须的。不然+-法算的距离就没谱了。
|
++
没有char *,每次+-就是member大小