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)


目录
相关文章
|
C语言
C typedef
C typedef,C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字,然后使用这个新的数据类型来直接定义结构变量。。
52 1
C++ typedef 使用大全
C++ typedef 使用大全
107 0
|
存储 安全 编译器
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
|
10月前
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
318 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
|
编译器 C语言
你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)
我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。
113 0
|
存储 编译器 C语言
typedef的使用
typedef的使用
178 0
|
存储 安全
浅谈C库函数——memcpy、memmove、memcmp、memset函数
浅谈C库函数——memcpy、memmove、memcmp、memset函数
292 0
【C】atoi和offsetof的介绍和模拟实现
【C】atoi和offsetof的介绍和模拟实现
103 0
【C】atoi和offsetof的介绍和模拟实现
|
存储
memset,calloc的区别
memset,calloc的区别
128 0
memset,calloc的区别
|
Windows
编程中的offsetof
编程中的offsetof
197 0