linux内置宏

本文详细介绍了Linux内核中常用的两个宏:off_set_of 和 container_of 的原理及应用场景。off_set_of 宏用于计算结构体成员的偏移量;container_of 宏则通过结构体成员指针逆向定位到结构体本身。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux内置的两个宏:这两个宏在驱动应用中很广泛

1 off_set_of(type,memeber)
type 结构体的类型, member结构体内的成员
这个是用来计算结构体内元素的偏移量
#define off_set_of(type,memeber)  \ \\接续符号
 ((long)&(((type *)0)->member))

1.(type *)0 指向的是结构体的0地质处
2. ((type *)0)->member 得到了结构体某个成员变量名
3. &(((type *)0)->member)) 给这个成员变量取地址(相对于零地址取地址),此时的&(((type )0)->member))是一个指针类型。
4. 将指针类型强制装换为long型(int 型可能放不下)。
将0地址强制转换为TYPE类型指针,并取得member,然后获取该member地址,最后将该地址强制转换为表示大小的整数。该整数即为该成员的偏移量。
应用实例:
这里写图片描述

注意 :S是类型 &s是指针。


2 container_of(ptr,type, member)

通过结构体的元素来推断结构体的首地址
            结构体成员指针 结构体类型 结构体成员
 #define container_of(ptr, type, member)                        \
({typeof(((type *)0)->member) *_mptr = ptr;                 \
(type *)((char *)_mptr-off_set_of(type, member));})

1.typeof(((type *)0)->member)得到结构体成员变量的类型
2.typeof(((type *)0)->member) *_mptr = ptr 将ptr指针的值赋予_mptr ,因此_mptr 得到了结构体成员的实际的地址
3.结构体成员实际的地址减去该成员的偏移量就可以得到结构体的首地址。

应用实例:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值