offsetof的作用是返回结构体成员相对于结构体起始位置的偏移量,第一个参数需要传入结构体类型,第二个参数需要传入结构体成员名。
首先我们可以先看一下offsetof的官方声明:
offsetof (type,member)
从声明中可以看出它并没有类型检查,也就是说它可以接受任何形式的参数,而且因为它的第一个参数接收的是数据类型,即它是一个宏, 而宏的规则是替换那么我们应该如何对它进行模拟呢?结果如下代码。
在这段代码中“&(((type*)0)->name)”type和name都是用户传入参数。
首先我们先写一个整数0(你也可以写1,2,3,等任何一个),然后再对其进行强制类型转换(将它转换成用户传入的类型type)将数字0强制类型转换成一个地址这个地址的数据类型为type,那么代码就变成了这样
那么我们现在也就相当于得到了结构体类型起始位置的地址,那么只要我们再用其成员类型的地址减去其实地址也就得到了偏移量。(因为起始位置的地址为0所以我就没减)代码如下