首页
Portal
论坛
BBS
时事新闻
圈子
Group
本站守则
登录
立即注册
愚公移民
»
论坛
›
码农世界
›
心得分享
›
就算你是10年资深的C programmer,你能写出下面这样的代 ...
返回列表
发布新帖
查看:
337
|
回复:
0
就算你是10年资深的C programmer,你能写出下面这样的代码吗?
MACD大叔
MACD大叔
当前离线
积分
154
14
主题
14
回帖
154
积分
注册会员
注册会员, 积分 154, 距离下一级还需 46 积分
注册会员, 积分 154, 距离下一级还需 46 积分
积分
154
加好友
发消息
发表于 2024-11-26 15:27:48
|
查看全部
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
#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的人果然不一般啊
前半生以MAC为生,后半生以MACD为生
回复
举报
返回列表
发布新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
关灯
在本版发帖
扫一扫添加微信客服
返回顶部
快速回复
返回顶部
返回列表