以下是一个宏的意思是什么?
为什么要用0?
这个宏的返回值是什么?
#define container_of(ptr,type,member) \
({ \
typeof(((type *)0)->member) * p = (ptr); \
(type *)((unsigned long)p - (unsigned long)&(((type *)0)->member)); \
})
(type *)((unsigned long)p - (unsigned long)&(((type )0)->member))这段代码我理解是返回p的地址,用type解释,我觉得后面部分
- (unsigned long)&(((type *)0)->member)
可以不用欸,请问上面这个表达式能不能删掉?
是不能删去的。
如果可行,还请采纳:
这个宏的意思是将一个指向结构体成员的指针ptr,转换为指向该结构体的指针。
0作为空指针使用,因为只是为了在编译期间获取结构体成员的地址,不需要实际分配内存。
这个宏的返回值是指向结构体的指针。
关于删掉后面的表达式,这是不可以的,因为它是用来计算该结构体成员的地址并从ptr指针中减去该地址,从而得到指向结构体的指针。
你不减掉偏移量,那地址就根本没变呀,不还是结构体成员的地址吗
必须减掉它,才是结构体本身的地址