这是宏定义:
/**
* list_entry - get the struct for this entry
* @ptr: the &struct list_head pointer.
* @type: the type of the struct this is embedded in.
* @member: the name of the list_struct within the struct.
*/
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
我不明白为什么ptr被转换为(char *)
。我不能只从member
中减去ptr
的偏移量吗?像这样:
#define list_entry(ptr, type, member) \
((type *)((ptr)-(unsigned long)(&((type *)0)->member)))
谢谢!
答案 0 :(得分:5)
没有。指针算术等同于:
ptr[addend]
不是
(ptr_type *)((unsigned long)&ptr + addend)
后者需要显式转换为char *
(因为这是内存的单位)才能直接操作指针的值。