一个朋友说在keil里想使用container_of函数,然后我百度了一下,发现了这篇帖子,点击打开链接,将其复制放在keil5中编译不通过,在了解了container_of的作用之后,自己写了一个,并且已经测试通过。
首先,container_of的作用是从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。
container_of(ptr, type, member)
ptr:表示结构体中member的地址
type:表示结构体类型
member:表示结构体中的成员
通过ptr的地址可以返回结构体的首地址
实现:#define container_of(ptr, type, member) ((type*)(((int)ptr) - (int)(&(((type*)0)->member))))
测试:
//定义测试结构体
struct test_struct {
int num;
char ch;
float f1;
};
int main(void)
{
struct test_struct *ptest_struct;
struct test_struct init_struct ={12,'a',12.3};
char *ptr_ch = &init_struct.ch; //知道此结构体中ch成员的地址
ptest_struct = container_of(ptr_ch,struct test_struct,ch);
printf("init_struct =%p\n",&init_struct);
printf("ptest_struct =%p\n",ptest_struct);
printf("init_struct.num = %d\n",ptest_struct->num);
printf("init_struct.ch = %c\n",ptest_struct->ch);
printf("init_struct.f1 = %f\n",ptest_struct->f1);
return 0;
}
测试结果