#define FIELD_SIZE(t,f)(sizeof(((t*)0)->f)) 为什么没有错误

依山不傍水 2015-03-06 10:17:05
如标题:
#define FIELD_SIZE(t,f)(sizeof(((t*)0)->f))
这个宏为什么用起来没有问题?
我的理解是
(t*)0 将地址强转类型, ->f 只是取址,并没有访问内存,所以没有问题。
那么sizeof 是如何计算数据类型占用多少内存的呢?
...全文
131 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-03-06
  • 打赏
  • 举报
回复
想完全彻底弄懂sizeof,请参考gcc源代码中实现sizeof函数部分。
一根烂笔头 2015-03-06
  • 打赏
  • 举报
回复
怎么像内核的代码

 84 #define container_of(ptr, type, member) ({                      \
 85         const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
 86         (type *)( (char *)__mptr - offsetof(type,member) );})
自己搜container_of宏的解析 其实这个工作是编译器的做的
fly_dragon_fly 2015-03-06
  • 打赏
  • 举报
回复
sizeof是编译时确定,如果连编译器都无法确定语句的类型,又怎么生成执行代码呢?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧