zl程序教程

您现在的位置是:首页 >  其他

当前栏目

offsetof宏的原理以及作用

原理 以及 作用
2023-09-27 14:28:47 时间
虚拟一个TYPE类型的结构体变量,通过TYPE.MEMBER的方式来访问MEMBER成员,进而得到MEMBER成员相对于整个结构体首地址的偏移量。 作用:为接下来的container_of宏的讲解出现做铺垫 offsetof宏: #define offsetof(TYPE,MEMBER) ((int) ((TYPE *)0)- MEMBER) 接下来看看例程就明白了,其实这个宏挺简单的, ((TYPE *)0)- MEMBER其实相当于得到了成员的偏移减去0地址偏移,也就是结构体的首地址,进而就得到了该成员相当于整个结构体的偏移量。

原理:

虚拟一个TYPE类型的结构体变量,通过TYPE.MEMBER的方式来访问MEMBER成员,进而得到MEMBER成员相对于整个结构体首地址的偏移量。

作用:为接下来的container_of宏的讲解出现做铺垫

offsetof宏: #define offsetof(TYPE,MEMBER) ((int) ((TYPE *)0)- MEMBER)

接下来看看例程就明白了,其实这个宏挺简单的, ((TYPE *)0)- MEMBER其实相当于得到了成员的偏移减去0地址偏移,也就是结构体的首地址,进而就得到了该成员相当于整个结构体的偏移量。

#include stdio.h 

#define offsetof(TYPE,MEMBER) ((int) ((TYPE *)0)- MEMBER)

#pragma pack(4)

struct ptr

 char a ; 

 short b ; 

 int c ; 

 double d ;

#pragma pack()

int main(void)

 struct ptr Pt ;

 printf("ptr:%d\n",sizeof(struct ptr));//16

 //相对地址偏移量 

 int offset = offsetof(struct ptr,a); //0

 printf("offset:%d\n",offset);

 int offset1 = offsetof(struct ptr,b); //2

 printf("offset1:%d\n",offset1);

 int offset2 = offsetof(struct ptr,c); //4

 printf("offset2:%d\n",offset2);

 int offset3 = offsetof(struct ptr,d); //8

 printf("offset3:%d\n",offset3);

 return 0 ;

}






你是真的“C”——宏与函数的英雄本色 一、何为宏? 在进行宏和函数的对比时,我们先了解一下什么是宏。 #define 定义宏 #define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。 下面是宏的申明方式: #define name( parament-list ) stuff 其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
morixinguan ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。