offsetof宏讲解
首先来看下在cpluscplus对于offsetof宏给出的定义
macro代表的是宏
其中参数有两个
- type代表的是类型
- member代表的成员
该宏的作用是用来求出结构体成员相对于首地址的偏移量。
使用的方法如下,代码实例:
struct S
{
char c1;
int i;
char c2;
};
#include <stdio.h>
#include <stddef.h>
int main()
{
struct S s = {0};
printf("%d\n", offsetof(struct S, c1));
printf("%d\n", offsetof(struct S, i));
printf("%d\n", offsetof(struct S, c2));
return 0;
}
打印结果:
讲解:
模拟实现offsetof宏
在讲解中,我们可以看出,偏移量就是地址减去首地址的出来的一个数,那么我们假设地址为0,我们只需要取出地址,这个地址就是偏移量。
代码实例:
#include <stddef.h>
#include <stdio.h>
struct S
{
char c1;
int i;
char c2;
};
#define OFFSETOF(type, m_name) (size_t)&(((type*)0)->m_name)
int main()
{
struct S s = {0};
printf("%d\n", OFFSETOF(struct S, c1));
printf("%d\n", OFFSETOF(struct S, i));
printf("%d\n", OFFSETOF(struct S, c2));
return 0;
}
讲解:
首先我们把地址设为0,那么就有:
#define OFFSETOF(type,m_name) ((type*)0)
这里呢就是地址设置为0,类型为type*类型的,注意这里的type只是进行替换,并不代表实际的类型
取出地址之后呢,我们就去找结构体的成员,那么就有:
#define OFFSETOF(type,m_name) (((type*)0)->m_name)
这里找到结构体的成员之后,我们再取出这个成员的地址,那么就有:
#define OFFSETOF(type,m_name) &(((type*)0)->m_name)
取出地址之后呢,我们再进行类型的强制转换。
#define OFFSETOF(type,m_name) (size_t)(&(((type*)0)->m_name))
打印结果: