返回列表 发布新帖
查看: 46|回复: 0

就算你是10年资深的C programmer,你能写出下面这样的代码吗?

9

主题

4

回帖

59

积分

注册会员

积分
59
发表于 5 天前 | 查看全部 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

×
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)


从字面定义和内容表达上比较容易理解,宏offsetof用来获取结构体TYPE里面的成员MEMBER在结构体内的偏移量。

如何实现的呢?

    1.                         0
    2.                ((TYPE *)0)
    3.              ( ((TYPE *)0)->MEMBER )
    4.             &( ((TYPE *)0)->MEMBER )
    5.  ( (size_t) &( ((TYPE *)0)->MEMBER )


什么?0转换为TYPE *的指针?这不是C语言里面的空指针吗?
巧妙之处在于,这里并不会真的去读取0这个地址里面的某个成员,而只是求某个成员在其中的OFFSET,至于从哪里OFFSET,并不做检查。

当然,你也可以写成这样,效果是一样的
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)32)->MEMBER - 32)

这行“简单”又无比简洁代码体现了原作者对程序编译生成的深刻理解,写Linux kernel的人果然不一般啊


回复

举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表