内核中常用宏定义——container_of详解
创作时间:
作者:
@小白创作中心
内核中常用宏定义——container_of详解
引用
1
来源
1.
https://www.cnblogs.com/shoresouth/articles/18292012
在C语言编程中,特别是内核开发和嵌入式系统编程中,container_of是一个非常实用的宏定义。它可以帮助开发者通过指向结构体成员的指针来获取指向包含该成员的结构体的指针。本文将详细介绍container_of的定义、参数、工作原理,并通过具体示例帮助读者理解其使用方法。
简介
container_of是一个宏,通常在C语言编程中用于在嵌入式系统或内核开发中。它用于通过指向结构体成员的指针来获取指向包含该成员的结构体的指针。
简单来说,它的主要作用是根据结构体中的已知的成员变量的地址,来寻求该结构体的首地址。
宏定义
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type, member)); })
宏参数
ptr: 指向结构体成员的指针。type: 结构体的类型。member: 结构体中成员的名称。
工作原理
typeof(((type *)0)->member): 获取member成员的类型。通过假设 0 地址处有一个type类型的结构体,使用->运算符获取member成员的类型。const typeof(((type *)0)->member) *__mptr = (ptr): 定义一个指向member类型的常量指针__mptr,并将其初始化为ptr。(type *)((char *)__mptr - offsetof(type, member)): 通过将__mptr转换为char *类型指针,然后减去member成员在结构体type中的偏移量来获取指向结构体type的指针。
使用示例
#include <stdio.h>
#include <stddef.h> // For offsetof macro
struct my_struct {
int a;
float b;
char c;
};
int main() {
struct my_struct example = { 1, 2.0f, 'A' };
char *ptr_to_c = &example.c;
struct my_struct *container = container_of(ptr_to_c, struct my_struct, c);
printf("container->a: %d\n", container->a);
printf("container->b: %f\n", container->b);
printf("container->c: %c\n", container->c);
return 0;
}
输出结果:
container->a: 1
container->b: 2.000000
container->c: A
- 假设
ptr_to_c是指向example.c的指针。 - 计算
c在struct my_struct中的偏移量,即offsetof(struct my_struct, c)。 - 将
ptr_to_c转换为char *,然后减去c的偏移量,得到example结构体的地址。
总结
container_of宏是一个强大的工具,用于通过结构体成员的指针获取指向包含该成员的结构体的指针。在内核开发和嵌入式编程中,它广泛用于处理嵌套数据结构和回调机制。
本文原文来自cnblogs
热门推荐
跟着《黑神话:悟空》,体会悬空寺等山西古建之美
如何铺垫项目沟通
70年房产证到期后要交多少钱?房产证分开的收费与好处详解
成都公积金支持异地缴存职工贷款,需满足9项条件
肺结节是否需要定期检查?医生专业解答来了
比亚迪秦在家充电方法
孩子要不要参加各种兴趣班,如何选?
激光尘埃粒子计数器:守护空气质量的隐形卫士
斯坦福大学政治学专业怎么样
男孩取名带水寓意字大全 (男孩取名带水的字)
如何撰写房屋描述以吸引潜在买家?房屋描述中应突出哪些卖点?
如何通过日常饮食调整?提升整体活力与精神状态?
个体工商户注销营业执照及清税证明操作指南
房车出游时需要注意哪些事项?
微信公众号文章添加话题标签的详细步骤
构建和谐家庭:面对内耗,我们需要怎么做?
收入和利得的区别和联系是什么
内存时序大揭秘!DDR4 3000 vs 3200 vs 3600,性价比之争
揭开隐秘的世界,极地冰下湖!
数字孪生模型,实现铁路信号系统的现代化
什么叫大限和小限,怎么看大限走到哪一宫
肠道息肉的5个预警信号,别等肠癌才反应过来
深表感谢的句子(实用50句)
数值方法:非线性函数求根和求函数极值
GDB数据导入数据库的多种方法详解
中国十大馄饨
什么是交房标准?从法律基础到验收流程全解析
次世代的英雄联盟MMO,拳头游戏选择推倒重来
如何管理客户穿搭风格
“大雪不冻,倒春寒”?2024年是冷冬还是暖冬?看看老祖宗怎么说