使用宏模拟offsetof

简介: 使用宏模拟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;
}



相关文章
|
19天前
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
21 0
|
19天前
|
程序员 C语言 UED
详解C语言assert宏
详解C语言assert宏
30 0
|
19天前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
19天前
|
存储 C++
c/c++宏定义(函数)
c/c++宏定义(函数)
|
19天前
#define定义常量和宏
#define定义常量和宏
14 0
|
19天前
|
Linux
offsetof宏与container_of宏
offsetof宏与container_of宏
15 0
|
19天前
用一行代码实现宏offsetof
用一行代码实现宏offsetof
|
19天前
|
C语言
详解C语言可变参数列表(stdarg头文件及其定义的宏)
详解C语言可变参数列表(stdarg头文件及其定义的宏)
54 0
|
19天前
|
存储 Unix Linux
<C语言错误处理> <signal.h>头文件及signal函数等内置函数
<C语言错误处理> <signal.h>头文件及signal函数等内置函数
|
19天前
|
编译器
#define 宏定义看这一篇文章就够了
#define 宏定义看这一篇文章就够了
140 0