返回信息流#define CR_OFFSETOF(type, member) ((size_t)&((type*)0)->member)
#define CR_LIST_ENTRY(ptr, type, member) ({\
const typeof(((type*)0)->member)* __mptr = (ptr); \
(type*)((char*)__mptr - CR_OFFSETOF(type, member));})
我知道CR_OFFSETOF(type, member)是求一个偏移量,
CR_LIST_ENTRY(ptr, type, member) 是由指向type结构体中member成员的指针得到指向type结构体的指针,
现在想问:const typeof(((type*)0)->member)* __mptr = (ptr); 是什么意思?ptr是做什么用的?
这是一条镜像帖。来源:北邮人论坛 / cpp / #36465同步于 2010/3/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]请大牛看看这几行代码的意思
salooloo
2010/3/10镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
#define CR_OFFSETOF(type, member) ((size_t)&((type*)0)->member)
这句是求,在 type 这种数据结构里,成员变量member的地址与结构首地址的差。
#define CR_LIST_ENTRY(ptr, type, member) ({\
const typeof(((type*)0)->member)* __mptr = (ptr); \
(type*)((char*)__mptr - CR_OFFSETOF(type, member));})
这句估计是输入一个type类型的变量中成员member的地址,结构名(type),变量名(member),算出这个type变量的首地址。
就像 typedef struct list
{
int a;
int b;
}list;
list temp;
CR_LIST_ENTRY(&temp->b, list, b) 返回的就是&temp
const typeof(((type*)0)->member)* __mptr = (ptr); 这一句是什么意思呢?
【 在 nobody 的大作中提到: 】
: #define CR_OFFSETOF(type, member) ((size_t)&((type*)0)->member)
: 这句是求,在 type 这种数据结构里,成员变量member的地址与结构首地址的差。
: #define CR_LIST_ENTRY(ptr, type, member) ({\
: ...................
【 在 salooloo 的大作中提到: 】
: #define CR_OFFSETOF(type, member) ((size_t)&((type*)0)->member)
: #define CR_LIST_ENTRY(ptr, type, member) ({\
: const typeof(((type*)0)->member)* __mptr = (ptr); \
: ...................
此宏让我想起了Linux 内核 的一个宏 相当精彩
【 在 salooloo 的大作中提到: 】
: const typeof(((type*)0)->member)* __mptr = (ptr); 这一句是什么意思呢?
给_mptr这个临时变量赋值,前面是类型吧
他首先将0强制转化成type类型的指针(linux内核下的一种技巧),然后取出该类型的member成员,typeof为得到member成员的类型,typeof(((type*)0)->member)就是member的类型,然后定义了一个这种类型的常指针,并用ptr对其赋值。
【 在 salooloo 的大作中提到: 】
: const typeof(((type*)0)->member)* __mptr = (ptr); 这一句是什么意思呢?
哈哈,Linux内核里链表的实现方式呀,这个太经典了,每次看到这个代码都一阵激动!
【 在 salooloo 的大作中提到: 】
: #define CR_OFFSETOF(type, member) ((size_t)&((type*)0)->member)
: #define CR_LIST_ENTRY(ptr, type, member) ({\
: const typeof(((type*)0)->member)* __mptr = (ptr); \
: ...................
有点不解:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) - offsetof(type, member))
这样才能赋值给别人吧
p = list_entry(...);
#define CR_LIST_ENTRY(ptr, type, member) ({\
const typeof(((type*)0)->member)* __mptr = (ptr); \
(type*)((char*)__mptr - CR_OFFSETOF(type, member));})
这该怎么用?