返回信息流#define _offsetof(t,m) ((int)(char*)&((t *)0) -> m),问一下,这个(t*)0在这是什么意思?起什么作用的?谢谢了啊
这是一条镜像帖。来源:北邮人论坛 / cpp / #43977同步于 2010/9/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
0的指针类型,谢谢
chemical
2010/9/16镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
结构体t成员m的偏移。
这个还是很巧妙的。
【 在 chemical (星云chemical) 的大作中提到: 】
: #define _offsetof(t,m) ((int)(char*)&((t *)0) -> m),问一下,这个(t*)0在这是什么意思?起什么作用的?谢谢了啊
【 在 rainblue 的大作中提到: 】
: 结构体t成员m的偏移。
: 这个还是很巧妙的。
: 【 在 chemical (星云chemical) 的大作中提到: 】
: ...................
就是说跟t.m是相同的意思吗?
除了t* 0那个地方
别的地方也不懂……lz讲解下?
【 在 chemical (星云chemical) 的大作中提到: 】
: #define _offsetof(t,m) ((int)(char*)&((t *)0) -> m),问一下,这个(t*)0在这是什么意思?起什么作用的?谢谢了啊
Linux内核中就有类似的代码。。。很经典的代码。。。
#define _offsetof(t,m) ( (int) (char*) & ((t *)0)-> m )
假如t是一个struct
我随意写一个
{
int a;
int b;
char m;
}
先将0转换成t类型的指针,然后对这个指针取m成员的地址,然后转换这个地址为char *,再转换成int,不就是m在这个结构体中的偏移么?
Linux内核中,使用类似的代码,用一个list_head的结构体链接各种队来着吧。。。
由结构体成员的地址,求出结构体的地址,用的就是类似于& ((t *)0)-> m这样的代码
跟(&t.m - &t)相同。。。
【 在 chemical 的大作中提到: 】
: : 结构体t成员m的偏移。
: : 这个还是很巧妙的。
: : 【 在 chemical (星云chemical) 的大作中提到: 】
: ...................
(&t.m - &t)需要进行减法计算,而楼主的那个是在编译期就算好了的,零步就得出。
【 在 potatossss 的大作中提到: 】
: 跟(&t.m - &t)相同。。。