offsetof的实现

简介: offsetof的实现

offsetof的作用是返回结构体成员相对于结构体起始位置的偏移量,第一个参数需要传入结构体类型,第二个参数需要传入结构体成员名


首先我们可以先看一下offsetof的官方声明:

offsetof (type,member)


从声明中可以看出它并没有类型检查,也就是说它可以接受任何形式的参数,而且因为它的第一个参数接收的是数据类型,即它是一个宏, 而宏的规则是替换那么我们应该如何对它进行模拟呢?结果如下代码。

#define OFFSETOF(type, name) &(((type*)0)->name)

image.gif

在这段代码中“&(((type*)0)->name)”type和name都是用户传入参数。


首先我们先写一个整数0(你也可以写1,2,3,等任何一个),然后再对其进行强制类型转换(将它转换成用户传入的类型type)将数字0强制类型转换成一个地址这个地址的数据类型为type,那么代码就变成了这样

#define OFFSETOF(type, name) (type*)0

那么我们现在也就相当于得到了结构体类型起始位置的地址,那么只要我们再用其成员类型的地址减去其实地址也就得到了偏移量。(因为起始位置的地址为0所以我就没减)代码如下

#define OFFSETOF(type, name) &(((type*)0)->name)


目录
相关文章
|
5月前
offsetof宏(想了解offsetof宏的使用,那么看这一篇就足够了!)
offsetof宏(想了解offsetof宏的使用,那么看这一篇就足够了!)
|
5月前
|
C语言
sizeof
【6月更文挑战第17天】
63 1
|
存储 安全 编译器
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
|
6月前
|
存储 C语言
关于sizeof介绍与分享给大家介绍
关于sizeof介绍与分享给大家介绍
|
6月前
|
编译器
memset结构体报错的问题
偶尔我们使用了会使用memset初始化结构体,但是会导致有时候编译器崩溃,这时候要检查结构体里面的各个字段是否全是基本类型,如果是自定义类或者库里面的类,有时候就会出现莫名其妙的错误,结构体初始化可以直接使用 {0}进行初始化
70 0
|
编译器 C语言
你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)
我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。
86 0
|
编译器 C语言 C++
【C语言】结构体与offsetof实现(上)
【C语言】结构体与offsetof实现
70 0
|
C语言 C++
【C语言】结构体与offsetof实现(下)
【C语言】结构体与offsetof实现(下)
72 0
|
存储 编译器 C++
C++ sizeof 的介绍
C++ sizeof 的介绍
113 0