为了账号安全,请及时绑定邮箱和手机立即绑定

define宏定义的这句话是什么意思呢?

define宏定义的这句话是什么意思呢?

撒科打诨 2019-04-13 08:45:54
在一本书上看到了这段代码,其含义是求一个结构体成员相对于结构体开始位置的偏移量,但不理解其含义,求大牛解释.struct{inta;doubleb[20];doublec;}struc;#defineFIND(struc,c)((size_t)&((struc*)0)->e)
查看完整描述

2 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

这个宏应该是参考linux的offsetof宏定义:#defineoffsetof(TYPE,MEMBER)(size_t)(&(((TYPE*)0)->MEMBER))
这个宏的分析:
(TYPE*)0将0地址强转为TYPE类型的指针
((TYPE*)0)->MEMBER获取TYPE结构体中的成员MEMBER
&(((TYPE*)0)->MEMBER)获取成员MEMBER的地址,通常我们拿这个地址值减去整个结构体的起始地址即可得出MEMBER的偏移地址,但因为现在结构体的起始地址为0(这个0就是整个宏定义的精华所在),所以获取的地址即为实际的偏移地址(减去0等于没减嘛)
                            
查看完整回答
反对 回复 2019-04-13
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

struct结构体对象的内存位置是连续的,假设整个对象的起始地址是0,(struc*)0这里做了强制转换;那么我们首先解引用取得结构体某个元素的值
struc*p=(struc*)0;
doublec=p->c;
然后再获得元素的地址,这个地址就是相对于整个结构体对象内存的起始位置的
size_toffset=(size_t)(&c-(size_t)0);
题主你看的是扫描版的么?
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 630 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信