offsetof宏的模拟实现

2023-04-27 21:25:40 浏览数 (2)

前言

本文介绍并模拟实现宏offsetof


offsetof介绍

格式:offsetof(type, member) 头文件:<stddef.h> 这个宏有两个参数:

type是一个结构体类型或联合类型; member是结构体或联合的某一个成员

功能:返回成员相对于结构或联合起始地址的偏移量(以字节为单位),返回类型是size_t


模拟实现

结构体起始地址加上该成员相对于起始地址的偏移量就是成员变量的地址想要知道成员相对于结构体起始地址的偏移量,假设结构体起始地址位于0地址处,那么结构体成员变量的地址强制类型转换size_t相当于该成员相对于起始地址的偏移量

代码语言:javascript复制
#define OFFSETOF(type, member) (size_t)( &( ( ( type* )0 ) -> member) )

  1. 把整数0强制类型转换为type*类型,相当于一个结构体的起始地址位于0地址处;
  2. 接着通过箭头访问操作符访问结构体成员member,相当于找到了结构体成员member
  3. 取出结构体成员member的地址并强制类型转换为size_t类型;

例子:

代码语言:javascript复制
#include <stdio.h>
#include <stddef.h>
#define OFFSETOF(type, member) (size_t)(&(((type*)0)->member))

struct S {
	int a;//0~3
	char b;//4
	//5
	short c;//6~7
};
int main() {
	printf("%dn", offsetof(struct S, a));
	printf("%dn", offsetof(struct S, b));
	printf("%dn", offsetof(struct S, c));
	
	printf("%dn", OFFSETOF(struct S, a));
	printf("%dn", OFFSETOF(struct S, b));
	printf("%dn", OFFSETOF(struct S, c));

	return 0;
}

运行结果:


END

0 人点赞