内核中常用宏定义——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
热门推荐
“孩子蹿个子秘籍”请查收
小儿便秘中医解决策略:润肠食疗联合腹部推拿通便且不伤正气
涛岛潜水攻略:全球潜水圣地探秘与实用指南
国家趣谈127:什么是申根区?申根区有哪些国家?
只锻炼腹部肌肉的人如何健身
年轻人为何钟情李宗盛作品?
萤火虫的活动季节、寿命与食物来源
步步为“痛”?如何预防治疗足跟痛
员工未签劳动合同离职了怎么处理
笔记本键盘清洁全攻略:物理、化学方法和专业工具详解
不合群是有心理问题吗
狐獴是什么动物,生活环境在哪些地方,有什么特点
门球运动:规则与技巧详解
宏观经济数据是如何影响期货市场走势的?
腰肌拉伤的症状及护理方法
张惠妹最经典的10首歌
二楼洋房的采光和通风条件如何优化?这种优化对居住舒适度有何影响?
遭遇交通事故?教您如何收集证据保护自己
腿部力量训练指南:8种有效锻炼方法
热梗玩过头,当心陷入“梗困境”
软件外包如何安全生产
夯实素描根基:基础训练的六大关键维度
中科院研究揭示:热带地区树木化学多样性远高于温带地区
电镀添加剂产品配方剖析成分检测还原及分类
2025年大学生如何当兵?流程全解析!
长下坡路段安全驾驶技巧:空挡滑行真的安全吗?
腰椎间盘突出热敷好吗?医生教你正确使用热敷缓解疼痛
战略性矿产供应安全挑战加剧,专家呼吁加强国内增储上产及国际合作
钗头凤·红酥手:陆游与唐婉的爱情绝唱
设计项目背景规划怎么写