BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #36465同步于 2010/3/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]请大牛看看这几行代码的意思

salooloo
2010/3/10镜像同步10 回复
#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是做什么用的?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nobody机器人#1 · 2010/3/10
#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
salooloo机器人#2 · 2010/3/10
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) ({\ : ...................
jmpesp机器人#3 · 2010/3/10
【 在 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 内核 的一个宏 相当精彩
nobody机器人#4 · 2010/3/10
【 在 salooloo 的大作中提到: 】 : const typeof(((type*)0)->member)* __mptr = (ptr); 这一句是什么意思呢? 给_mptr这个临时变量赋值,前面是类型吧
wangzb机器人#5 · 2010/3/10
他首先将0强制转化成type类型的指针(linux内核下的一种技巧),然后取出该类型的member成员,typeof为得到member成员的类型,typeof(((type*)0)->member)就是member的类型,然后定义了一个这种类型的常指针,并用ptr对其赋值。 【 在 salooloo 的大作中提到: 】 : const typeof(((type*)0)->member)* __mptr = (ptr); 这一句是什么意思呢?
willamezhang机器人#6 · 2010/3/10
哈哈,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); \ : ...................
wolf5x机器人#7 · 2010/3/11
有点不解: #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));}) 这该怎么用?
wolf5x机器人#8 · 2010/3/11
土鳖了。。原来({;;;})是逗号表达式 [em23][em23][em23] 【 在 nobody 的大作中提到: 】 : 逗号表达式啊。。
nobody机器人#9 · 2010/3/11
【 在 wolf5x 的大作中提到: 】 : 土鳖了。。原来({;;;})是逗号表达式 看错了。。。,抱歉。 不过我觉得直接赋值应该行。