linux kernel中typeof和container_of的理解

Linux内核中的typeof编程 总结一下,typeof宏是Linux内核开发中一个非常有用的工具,它可以在编译期间执行类型推导,帮助开发人员编写更加健壮和可维护的代码。我们可以使用typeof宏来获取变量、表达式或类型的类型,并根据类型执行不同的操作。在Linux内核开发中,typeof是一个非常有用的编程宏。例如,它可以用于编写类型安全的宏,根据不同类型的参数执行不同的操作。在上面的示例中,my_macro宏根据参数x的类型执行不同的操作。通过使用typeof宏,我们可以在编译期间确定参数的类型,并在宏中针对不同的类型采取相应的行动。 阅读详情

1.typeof引入原因

#define min(x,y) ((x) > (y) ? (y) : (x))

如果min(x++ , y++),这个宏定义就会有问题


#define min(X,Y)  \
(__extension__  \
({  \
   typeof(X) __x=(X), __y=(Y);   \
   (__x<__y)?__x:__y;  \
}) \
) 

此时linux kernel引入了typeof,即取变量的定义。

2.container_of

1> Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。
2>接口:
container_of(ptr, type, member) 
ptr:表示结构体中member的地址
type:表示结构体类型
member:表示结构体中的成员
通过ptr的地址可以返回结构体的首地址

举例说明

struct student{

...

list_head list

};

list_head *now_list;

container_of(nowlist, struct student, list) ;

此时通过container_of就得到了nowlist对应的student的首地址。

经常用于链表操作


Obsidian跨设备同步实战:阿里云OSS与Remotely Save插件配置指南 本文详细介绍了如何利用阿里云OSS对象存储与Remotely Save插件,为Obsidian笔记软件搭建一个低成本、高可靠性的私有化多端同步方案。从创建OSS Bucket、配置CORS规则、生成子账户密钥,到插件安装与多设备同步策略,提供了完整的实战配置指南,有效解决Obsidian用户的跨设备同步痛点。 阅读详情

相关推荐

Axure原型模板与元件库APP交互设计素材(附资料)

在Axure中,手机模型是展示APP或小程序界面效果的重要工具。通过导入手机模型元件,设计师可以更加直观地模拟真实设备的显示效果,从而更准确地评估设计的可行性和用户体验。Axure官方及第三方资源库中提供了多种品牌和型号的手机模型,如iPhone、Android等,设计师可以根据项目需求选择合适的模型进行使用。Axure作为一款强大的原型设计工具,为APP和小程序的设计与开发提供了丰富的界面组件元件库和交互设计素材。

招风的黑耳优快云 1981

linux内核中的typeof

linux内核中的typeof 内核版本:2.6.14 嵌入式开发交流群:289195589,欢迎加入! 今天分析内核时又看到了typeof,只知道它大概是返回变量的类型,后来上网查了下发现这个关键字在linux中用的非常多。如果你对sizeof很熟悉的话,那么大可进行类推,sizeof(exp)返回的是exp的数据类型大小,那么typeof(exp.)返回的就是exp的数据类型。下面是linu...

系统运维 210

【小程序】支付宝直付通解决方案

支付宝直付通是支付宝为小程序提供的一种支付解决方案,可以实现小程序中直接使用支付宝进行支付。以上是一个简单的支付宝直付通解决方案及相关代码示例。具体的使用还需要根据自己的业务需求进行定制化开发和调整。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1281

详解内核常用的两个表达式

1、通过typeof来获得类型信息       获取一个表达式类型信息的另一种方法是使用typeof。使用这个关键字的语法和sizeof的十分类似,但在语义上类似于用typedef定义的类型名结构。       有两种方式来书写typeof的参数:使用一个表达式或者使用一个类型。下面的例子是使用一个表达式的方式:            typeof(x[0][1])       这里假定x

chenlong12580的专栏 1542

深入解析EXI协议在ISO15118-2命令测试中的编解码实践

本文深入探讨了EXI协议在ISO15118-2车桩通信标准中的关键作用与实践方法。EXI编解码测试是确保通信准确性与效率的核心环节,文章详细介绍了从搭建测试环境、选择工具库到编写完整测试代码的全过程,并分析了结果差异的常见原因与调试技巧,为电动汽车充电系统的开发者提供了实用的技术指南。

potato的博客 1050

工程师必读一次性讲明白系列(十三)眼图、阻抗匹配、信号一致性、射频匹配、电磁感应

概念主要作用影响因素解决方法眼图评估信号质量,显示失真和噪声噪声、信号失真、时序抖动改善信号源、使用低噪声组件阻抗匹配避免信号反射,提高传输效率阻抗不匹配、传输线路特性使用匹配电路、适配器信号一致性保证信号稳定准确传输传输线路、噪声干扰使用屏蔽、滤波器,选择合适线路射频匹配确保射频信号高效传输天线设计、阻抗不匹配使用射频匹配器、调整天线设计电磁感应防止电磁干扰对信号的影响设备之间的电磁干扰(EMI)屏蔽、接地、滤波器。

weixin_43199439的博客 160

typeof在kernel中的使用——C语言的“编译时多态”

大家都知道,C语言本身没有多态的概念,函数没有重载的概念。然而随着C语言编写的软件逐渐庞大,越来越多地需要引入一些其他语言中的特性,来帮助更高效地进行开发,Linux kernel是一个典型例子。 在动态类型的语言里面,往往有typeof这种语法,来获取变量的数据类型,比如JavaScript当中,typeof以字符串型式返回了这个变量的数据类型,借由这种特性,往往可以根据传入参数的类型不同,产

lin111000713的专栏 810

LVGL colorwheel组件教程一(调色板)

【代码】LVGL colorwheel组件教程一(调色板)

摸鱼专家 444

linux typeof 头文件,C语言typeof详解

typeof 是 GNU C 标准里特有的扩展,标准的 ISO C 并没有这个关键字,所以在编译的时候不能加任何 ISO 的 C 标准选项,否则会报错。使用时加入-std=gnu90 即 GNU 的标准即可。typeof的作用类似与sizeof,区别在于sizeof是得到参数的大小而typeof则是推导出参数的类型。typeof的参数可以是两种形式:表达式或类型。如:typeof(int *) a...

weixin_32767301的博客 3234

华为OD机试2025C卷真题题库目录|机考题库 + 算法考点详解

本文整理华为OD 2025C卷 机试(机考)题库,提供高频考点精析与详细题目内容,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 3991

[特殊字符] PetaLinux Qt 程序(WindRadar)无法自动启动问题解决文档

摘要:本文档解决了PetaLinux 2020.1系统中Qt程序(WindRadar)无法开机自动显示界面的问题。通过分析发现,自动启动时缺少DISPLAY=:0.0环境变量导致Qt找不到显示设备。最终在autostart.sh脚本中添加该变量,并完善了字体加载、驱动加载、显示设备检测等流程,确保程序正常自启显示界面。完整脚本包含路径检测、环境配置和错误处理,经验证各项功能均正常运行。

梁俊星的博客 328

Linux kernel container_of 宏

  目录 基本理解container_of 宏 深入探究container_of 宏 container_of 宏 版本一 container_of 宏 版本二 container_of 宏 版本三 基本理解container_of 宏 container_of,顾名思义就是某某某的容器,也就是说某某某成员变量所在的结构体是谁。 struct cntner { int i; ...

yetaibing1990的博客 781

科研问答:医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

MD Code 1510

深入解析Linux内核container_of宏:从内存布局到高效数据结构设计

在C语言系统编程中,理解数据结构的内存布局和指针运算是核心基础。通过结构体成员地址反向计算其所属结构体基地址,是一种高效的内存寻址技术,其原理基于编译期计算的成员偏移量。这种技术在内核开发和高性能库设计中具有重要价值,能够实现零开销的抽象,广泛应用于链表、工作队列等回调机制的场景。本文以Linux内核中经典的container_of宏为切入点,结合结构体对齐和GCC扩展特性,深入剖析其实现机制,并探讨其在嵌入式开发和系统编程中的实际应用。

weixin_30325487的博客 415

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【linux】container_of 理解

转自:http://blog.youkuaiyun.com/yinkaizhong/article/details/4129902 问题:如何通过结构中的某个变量获取结构本身的指针??? 关于container_of见kernel.h中: /** * container_of - cast a member of a structure out to the containing st

chenglong_abc的专栏 751

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深入解析Linux内核container_of宏:原理、实现与应用实践

在C语言系统编程中,指针操作与数据结构管理是核心基础。通过指针偏移与地址计算,可以实现高效灵活的内存访问,这是理解底层内存布局的关键。这种技术价值在于,它允许开发者从结构体成员指针反向定位其所属的完整容器结构,从而在资源受限的环境下实现类似面向对象的多态与封装,极大地提升了代码的复用性与模块化。这一原理广泛应用于操作系统内核、嵌入式系统及高性能中间件等场景,用于构建通用数据结构(如链表)与回调机制。本文以Linux内核中广泛使用的container_of宏为具体案例,剖析其如何通过offsetof与类型安全

weixin_34337381的博客 424

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux 内核中container_of的理解

在linux kernel中, container_of的定义如下: 其作用是根据结构体类型、它的一个成员地址及该成员名称来获取该结构体的起始地址。 其中, typeof 是GNU C对标准C的一个扩展,用于获取指定变量的数据类型。 此外用到了另外一个宏定义: offsetof 获取结构体成员在结构体内部的偏移。它的实现很巧妙,即将0x0位置当做一个TYPE类型的结构体,此时结构...

weixin_33953249的博客 125

container_of 理解

问题:如何通过结构中的某个变量获取结构本身的指针??? 关于container_of见kernel.h中: /** * container_of - cast a member of a structure out to the containing structure * @ptr:     the pointer to the member. * @type:     the t

周翔的专栏 862

内核宏定义container_of的理解

在阅读内核代码时特别是驱动代码,经常碰到使用contiainer_of宏定义的情况,由一个成员变量地址来获取这个包含这个成员的结构体的地址。下面来分析一下这个宏定义的实现 在include/linux/kernel.h文件中定义如下: /**  * container_of - cast a member of a structure out to the containing st

做一个有技术追求的人 1686

Linux内核container_of宏:从侵入式链表到C语言高级编程

在C语言系统编程中,数据结构与算法的解耦是实现代码复用和高效内存管理的关键。侵入式数据结构通过将独立的链接节点嵌入业务结构体,实现了通用算法与具体数据的分离,其核心原理在于利用结构体内存布局的确定性。这种设计模式的技术价值在于避免了传统链表的代码重复、功能耦合和内存浪费问题,显著提升了代码的模块化和性能。在Linux内核开发、嵌入式系统和高性能中间件等应用场景中,这种模式被广泛用于进程管理、文件系统和网络协议栈等核心模块。本文深入解析了实现这一模式的关键宏——container_of,它通过巧妙的指针运算和

weixin_34032792的博客 400

linux内核常用函数,详解Linux内核中的container_of函数

前言在linux 内核中,container_of函数使用非常广,例如 linux内核链表 list_head、工作队列work_struct中。在linux内核中大名鼎鼎的宏container_of(),其实它的语法很简单,只是一些指针的灵活应用,它分两步:第一步,首先定义一个临时的数据类型(通过typeof( ((type *)0)->member)获得)与ptr相同的指针变量__mpt...

weixin_39885469的博客 385

linux container源码,Linux内核源码container_of宏及其标准C版本实现详解

目前为止最详尽解释Linux内核源码中的container_of宏及其标准C版本实现。在Linux内核源码文件 include/linux/kernel.h中,定义了container_of宏,源码如下:/*** container_of - cast a member of a structure out to the containing structure* @ptr: the...

weixin_42515093的博客 264

container_of 理解 .

问题:如何通过结构中的某个变量获取结构本身的指针??? 关于container_of见kernel.h中: /** * container_of - cast a member of a structure out to the containing structure * @ptr:     the pointer to the member. * @type:     the t

sanchuyayun的专栏 675
上一篇: linux gpio字符设备驱动
下一篇: linux设备分类
qingfengtsing
博客等级 码龄15年 343粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值