内核中常用宏定义——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
热门推荐
手机投屏电视的四种方法,一看就懂
值得收藏的免费学习网站
人工智能普及下的全球制造中心转移
光触媒(光催化剂)应用场景广泛 相关产品日益丰富
颈椎病该用记忆枕还是乳胶枕
春养肝正当时!6个神奇穴位,按对了肝好身体棒
世界杯球星发型盘点:从贝克汉姆到C罗的时尚变迁
猫瘟怎么治疗
《京剧脸谱》美术教学设计
京剧脸谱:传统艺术的瑰宝
尿酸高为什么会引起痛风
“40岁”方庄,解决“中年困境”,向新生长!
幼鸟吃完就拉的白色物质是什么?蘑菇宠医为你揭秘
2025惊蛰是哪一天 2025年惊蛰这天日子怎样
置物架使用全攻略:从摆放位置到注意事项,一文详解
直播运营员简历的工作经历怎么写
高速vs国道:200公里行程谁更胜一筹
人口拐点已临近,老龄化压力加剧,养老经济如何破题
一起探究“绝代奇书”《淮南子》中的气象智慧
华语星云奖科幻作家,靠异世界性转轻小说火出圈
出车险的索赔程序是怎样的
武当派十大武功绝学
经济形势段子:笑谈应对之术
浅析我国常规动力航母山东舰舷号-17的改进
红掌施肥攻略与肥料选择技巧,打造独一无二的红色盆栽!
全面掌握六大茶类的制作工艺流程及特点:从选茶到泡茶,一文解析
医疗器械注册新政下的半导体激光治疗仪合规路径
推荐两部末日题材漫画:请叫我英雄和漂流教室
显示效果的守护者:全面分析VGA信号质量影响因素
银行的银证转账的身份验证方式?