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

发布于 2022-08-29 19:46:21 字数 222 浏览 19 评论 0

在一本书上看到了这段代码,其含义是求一个结构体成员相对于结构体开始位置的偏移量,但不理解其含义,求大牛解释.

struct{
    int a;
    double b[20];
    double c;
}struc;

#define FIND(struc,c) ((size_t)&((struc *)0)->e)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

抹茶夏天i‖ 2022-09-05 19:46:21

这个宏应该是参考linuxoffsetof宏定义:
#define offsetof(TYPE, MEMBER) (size_t)(&(((TYPE*)0)->MEMBER))

这个宏的分析:

(TYPE*)00地址强转为TYPE类型的指针

((TYPE*)0)->MEMBER 获取TYPE结构体中的成员MEMBER

&(((TYPE*)0)->MEMBER) 获取成员MEMBER的地址, 通常我们拿这个地址值减去整个结构体的起始地址即可得出MEMBER的偏移地址, 但因为现在结构体的起始地址0(这个0就是整个宏定义的精华所在), 所以获取的地址即为实际的偏移地址(减去0等于没减嘛)

唱一曲作罢 2022-09-05 19:46:21

struct结构体对象的内存位置是连续的,假设整个对象的起始地址是0(struc *)0这里做了强制转换;那么我们首先解引用取得结构体某个元素的值

struc* p = (struc *)0;
double c = p->c;

然后再获得元素的地址,这个地址就是相对于整个结构体对象内存的起始位置的

size_t offset =(size_t)( &c - (size_t)0);

题主你看的是扫描版的么?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文