使用宏模拟offsetof

Posted 跳动的bit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用宏模拟offsetof相关的知识,希望对你有一定的参考价值。

🎗 先来回忆下offsetof宏是怎么使用的
⭕ 函数信息

#include<stdio.h>
#include<stddef.h>
struct A
{
	int a;
	short b;
	int c;
	char d;
};
int main()
{
	printf("%d\\n", offsetof(struct A, a));
	printf("%d\\n", offsetof(struct A, b));
	printf("%d\\n", offsetof(struct A, c));
	printf("%d\\n", offsetof(struct A, d));
	return 0;
}

📝 题述1:模拟一个offsetof宏
💨 输入描述:无
💨 输出描述:输出结构体所有成员相对于起始位置的偏移量
🔑 核心思想:
结构体成员的地址 - 起始地址就是这个结构体成员的偏移量
(int) & (((struct A*)0x400) -> b) - 0x400
假设在结构体的起始位置有一个struct A*类型的变量0,然后拿出结构体成员的地址,再把地址强转为整型就是这些成员相对于起始位置的偏移量

#include<stdio.h>
#define OFFSETOF(struct_name, member_name) (int)&(((struct_name*)0) -> member_name)
struct A
{
	double a;
	char b;
	int c;
};
int main()
{
	printf("%d\\n", OFFSETOF(struct A, a));
	printf("%d\\n", OFFSETOF(struct A, b));
	printf("%d\\n", OFFSETOF(struct A, c));
	return 0;
}

以上是关于使用宏模拟offsetof的主要内容,如果未能解决你的问题,请参考以下文章

offsetof宏与container_of宏

offsetof与container_of宏分析

container_of 和 offsetof宏

宏实现奇数偶数位交换及offsetof

linux内核中的offsetof与container_of宏

关于宏:container_of和 offsetof以及list_for_each_entry