内核中常用宏定义——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
热门推荐
进化论视角下价值投资的哲学探寻
平衡账本:让AA制变得更加高效
蒙托卡罗模拟法是什么?如何应用?优缺点与发展历程详解
冰浴促进跑者身体恢复 每次应洗多久?
冷水浴对身体好吗
92与95汽油混用真相:不仅不省油,还可能伤车!
雨刮片胶条如何更换?怎样选择适合的雨刮片胶条?
从拖延大王到高效小能手:孩子的蜕变之旅!
成语“魑魅魍魉”是什么意思?背后有什么典故?
冬天钓鱼必备装备清单,让你的垂钓之旅更加得心应手
曹操与刘备互相视为英雄,但为何取得的成就如此悬殊?
资金净值的含义是什么?资金净值对投资决策有何影响?
基金净值的影响因素及分析方法
不靠嗑药,人类很难「更快」了吗?
《临安春雨初霁》该怎样鉴赏?创作背景是什么?
轻松掌握:天线设计的知识点,千万别错过啦!
越南人口数据分析 披露鲜为人知的细节
刘晓庆再谈为什么不生孩子
古代皇后为何大多没孩子?——一段历史的探究
深度解析:商家收款码手续费收费标准及其影响因素
UI设计、交互设计、产品经理:谁能在互联网大逃杀中活到最后?
反流性食道炎症状及检查方法详解
广角|广州新政出台,文创概念扩容:博物馆文创能出“爆款”吗?
幼儿园小朋友早餐吃什么方便又营养
BMJ最新研究:SGLT-2抑制剂在2型糖尿病二线治疗中表现更优
真的不要久坐了,这个位置会凹陷!2 个方式改善→(附图解)
如何高效管理日程计划?这些方法你一定要知道!
洗牙后需要注意哪些事项?洗牙后的护理指南与建议
工具应用的创新与实践探索
本田雅阁用什么型号的机油比较好