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; }
typeof(data)
: 这是 GNU C 扩展,用于获取data
的类型。这样可以避免在宏中显式传递数据类型,而是根据参数data
推断出其类型。
(typeof(data) *)0
: 将 0 强制转换为指向data
类型的指针。这是一个技巧,目的是将指针指向空地址,即空指针。
&(((typeof(data) *)0)->member)
: 这是整个宏的核心部分。首先,它将空指针转换为指向data
类型的指针,然后通过>member
访问结构体中的member
成员。这样,就得到了member
相对于结构体首地址的偏移量。
(size_t)
: 最后,使用(size_t)
强制将结果转换为无符号整数,以确保得到正确的偏移量。