首页
Portal
论坛
BBS
时事新闻
圈子
Group
本站守则
登录
立即注册
愚公移民
»
论坛
›
码农世界
›
心得分享
›
就算你是10年资深的C programmer,你能写出下面这样的代 ...
返回列表
发布新帖
查看:
45
|
回复:
0
就算你是10年资深的C programmer,你能写出下面这样的代码吗?
MACD大叔
MACD大叔
当前离线
积分
59
9
主题
4
回帖
59
积分
注册会员
注册会员, 积分 59, 距离下一级还需 141 积分
注册会员, 积分 59, 距离下一级还需 141 积分
积分
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的人果然不一般啊
回复
举报
返回列表
发布新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
关灯
在本版发帖
扫一扫添加微信客服
返回顶部
快速回复
返回顶部
返回列表