宏函数求结构体成员偏移量

Tags
C语言
结构体
ID
9
 
Question:写一个宏函数,功能:求结构体成员相对于其首地址的偏移地址
Answer:
#include <stdio.h> #define OFFSET(data, member) (size_t)(&(((typeof(data) *)0)->member)) typedef struct student { char x; int y; float z; } stu; int main(void) { stu stu; int offset; offset = OFFSET(stu, x); printf("%d\n",offset); return 0; }
  1. typeof(data): 这是 GNU C 扩展,用于获取 data 的类型。这样可以避免在宏中显式传递数据类型,而是根据参数 data 推断出其类型。
  1. (typeof(data) *)0: 将 0 强制转换为指向 data 类型的指针。这是一个技巧,目的是将指针指向空地址,即空指针。
  1. &(((typeof(data) *)0)->member): 这是整个宏的核心部分。首先,它将空指针转换为指向 data 类型的指针,然后通过 >member 访问结构体中的 member 成员。这样,就得到了 member 相对于结构体首地址的偏移量。
  1. (size_t): 最后,使用 (size_t) 强制将结果转换为无符号整数,以确保得到正确的偏移量。