LINUX内核中min和max宏的学习

别再纠结高边低边了!用TI BQ76952设计两轮车BMS,手把手教你选对架构(附电路图) 本文深度解析基于TI BQ76952芯片的电动两轮车BMS设计策略,涵盖高边/低边驱动选择、四种基础架构的电流路径分析及选型决策矩阵。通过实战案例分享,帮助工程师优化BMS架构,提升系统可靠性和成本效益,特别适合电摩和共享单车应用场景。 阅读详情

add linux kernel min, max define:

include/linux/kernel.h

/*

 * min()/max() macros that also do

 * strict type-checking.. See the

 * "unnecessary" pointer comparison.

 */

#define min(x,y) /

(__extension__/

({ /

        typeof(x) _x = (x);     /

        typeof(y) _y = (y);     /

        (void) (&_x == &_y);            /

        _x < _y ? _x : _y; })     /

)

#define max(x,y) /

(__extension__/

({ /

        typeof(x) _x = (x);     /

        typeof(y) _y = (y);     /

        (void) (&_x == &_y);            /

        _x > _y ? _x : _y; })     /

)

 

 

如上是include/linux/kernel.h中关于min和max两个很常用的宏的定义,在其中我们可以看到以下几个关键点:

1. 为何不用更简单的(x>y)?x:y 这样的方式来定义,而要重新赋值一次。

2. 为何要用({  })这样的结构包围代码块

3. 那个__extension__是什么东东? (有的版本没有这个__extension__)

4. (void)(&_x == &_y)有什么用,不是脱了裤子放屁么

 

 

 

解答:

1. 如果用户使用了min(x++,y++)会有怎样的结果?

   所以最好的办法是避免在宏的实体里让参数出现一次以上。老的linux用的是 x>?y,这个>?操作符是返回x和y中较大的一个,不过GCC的文档里已经决定抛弃这种老的用法了。

 

 

2. GCC的扩展里像{ }这种结构也是可以有值的,其值就是其中最后一个语句的值(包括左值),这里外面再加个括号是为了保险,比如:

   printf("猜猜会显示什么?/n答案是:%d/n",({

                int i = 0;

                int j = 999;

                int x = (i++) + j;

        })

    );

最后的输出会是:

猜猜会显示什么?

答案是:1000

 

 

3. __extension__:

GCC引入了很多标准C中的没有的扩展,如({和)},GCC提供了pednatic选项用于检测程序是否使用了GCC的扩展,当使用pedantic选项编译如下程序时:

int i;

typeof(i) j;

 

这个"typeof"是在GCC的内核里实现的,是GCC的扩展,在其他编译器下无法使用,所以如果编译时增加了-pedantic选项,这里就会报告WARN。

但是呢,现在用__extension__宏将其wrap起来以后,即使使用了-pedantic选项,也不会报告WARN了。

(不过我个人不太认可这种方式,这种方式隐藏了移植中的问题,但是反过来一想,换一个平台编译,那个平台的min和max宏肯定不会使用typeof,所以也许这个写法还是没问题的)

 

 


4.(void)(&_x == &_y)

        (void) (&_x == &_y)这句话本身都执行程序来讲完全是一句废话,它的作用在于,本身我们无法做这样的操作typeof(_x)==typeof(_y),所以故意判断他们2个的地址指针是否相等,显然是不可能相等,但是如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告。也就是说char *p; int *q; 然后p==q;,这个判断因为一个是char*一个是int*,会在编译时产生一个warning。巧妙就巧妙在这里。

  由于内核是很多开发着一起开发的,其中还有一些其他的实现,就跟我们平常用的一样:

  #define min(a,b) (((a) < (b)) ? (a) : (b))

  试想:

  min(++a,++b) ==> ((++a)<(++b))?(++a):(++b)

  是不是就有问题了,传入的参数被加了两次。

【探秘】二维异形件重叠移除算法:从度量到消除的实战解析 本文深入解析二维异形件重叠移除算法的核心技术与实战应用,涵盖重叠度量、零件扰动策略及消除方法。通过NFP(临界多边形)技术、空间分区加速等优化手段,有效解决异形件排版中的重叠问题,提升材料利用率和计算效率。适合制造业、CAD软件开发者及算法工程师参考。 阅读详情

相关推荐

深度学习【46】pix2pixHD

英伟达的pix2pixHD,能够合成高清的2048*1024图片,简直振奋人心。pix2pixHD是我之前介绍过的pix2pix的改进版本,使用多由粗到精的G网络和多尺度D网络(每个D网络都是用了pix2pix中同样的patch技术)。论文一开始用pix2pix尝试合成更高分辨率的图片,但发现效果不好,训练也很不稳定。所以就对pix2pix进行了一顿魔改。我们来看看他们是怎么改进的。由粗到精的G网络

DCD_LIN的博客 1万+

c语言 max 和 min 的宏写法

一般写法: #define max(a,b) ((a) >= (b) ? (a) : (b)) 缺点:这种写法会造成变量_a 或 _b 被重复求值两次,比如 max(i++, j++) 会被解释为 ((i++) >= (j++) ? (i++) : (j++)) 更好的写法: #define max(a, b) \ ({ \ typeof(a) _a = (a); \ typeof(b) _b = (b); \ _a >= _b ?..

m0_47696151的博客 5847

Elsevier期刊LaTeX双栏模板(cas-dc)实战:从Overleaf配置到投稿全流程

本文详细介绍了Elsevier期刊LaTeX双栏模板(cas-dc)在Overleaf平台上的配置与使用全流程,包括模板结构解析、标题与作者信息规范、摘要与关键词特殊格式、正文写作技巧、参考文献管理以及投稿前检查清单。特别针对Elsevier期刊投稿需求,提供了从模板安装到最终投稿的实用指南,帮助研究者高效完成论文排版工作。

weixin_28455801的博客 1323

linux内核中的min、max函数

<br />这些天为了整理一下前段时间看ldd3时所学的驱动知识,所以就去看了看usb驱动。不看不知道,一看吓一跳,里面有很多语法我发现用的太好了,不像我们平时那样写代码。里面写的代码真是太好了。然而要理解到里面的东西还是不容易的。今天看见usb_stor_access_xfer_buf函数的时候,想看看里面的min 函数是不是按照我们写的那么写。但是一看傻啦,还有些东东我还没用过,于是赶紧google一下,那到底下面代码是什么样的呢?大家可以到、include/linux/kernel.h 里面去找。不相

snowbabybw的专栏 1万+

【毕设全程指导】基于YOLOv8的包装商品检测与可视化系统(SKU110K实战)

本文介绍了一个基于YOLOv8的包装商品检测与可视化系统毕业设计方案。项目采用SKU110K数据集,通过CSV转TXT格式转换适配YOLO模型训练,包含详细的环境搭建、模型配置和训练流程。系统实现了包装商品的自动化检测,并开发了Tkinter可视化界面进行交互式检测展示。该方案结合产业应用需求与技术深度,既具备实用价值,又能充分展示学生的技术能力,适合作为计算机视觉相关专业的毕业设计选题。整个项目从数据准备到界面开发完整覆盖,帮助学生系统掌握目标检测项目的完整实现流程。

LXY_LOVE36的博客 147

基于Spring Security 6的OAuth2 系列之二 - 客户端--非代码演示授权码模式

至此,我们就使用浏览器+postman工具演示了通过授权码模式去获取Gitee的用户信息。这过程中,我们只是遵循OAuth2的流程,就能够实现授权方法。那么接下来,我们采用代码方式来实现这个流程。

代码让AI扣 1813

linux内核中的min(x,y)和max(x,y)宏定义

/linux/include/linux/kernel.h中有min(x, y)和max(x, y)的定义如下 #define min(x, y) ({ typeof(x) _min1 = x; typeof(y) _min2 = y; (void) (&_min1 == &_min2); _min1 < _min2 ? _min1 : _min2; }) #define max(x, y) ({

嵌入式与人工智能 1811

Autosar_MCAL_Port

PORT Driver就是对微控制器(MCU)的整个PORT模块进行初始化配置。很多端口和管脚被分配有多种不同的功能,即可以进行引脚功能复用,比如通用I/O、adc、pwm、spi等功能。因此,对PORT必须有一个整体的配置和初始化,对各管脚的具体配置和使用取决于微控制器和ECU的引脚功能分配。PORT初始化数据应当尽可能高效地写到每个端口。DIO驱动中所用到的端口的配置和初始化都是在PORT驱动模块中完成的。因此,在使用DIO功能之前,应先进行PORT的初始化。1、PortContainer说明。

不断debug,优化中…… 239

Linux min 和 max 宏

定义在 include/linux/kernel.h下 #define min(x,y) ({ /  typeof(x) _x = (x); /  typeof(y) _y = (y); /  (void) (&_x == &_y);  /  _x < _y ? _x : _y; }) #define max(x,y) ({ /  typeof(x) _x = (x); /

DICKJTK的专栏 3674

【华为OD机试】真题A卷-Linux发行版的数量(Python)

【华为OD机试】真题A卷-Linux发行版的数量(Python):Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。 发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行版。给你一个nxn的矩阵isConnected,其中isConnected[i][i]=1表示第i个发行版和第j个发行版直接

u014481728的博客 944

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

随着新零售和智能仓储的快速发展,商品识别技术成为计算机视觉领域的重要研究方向。本文详细介绍了基于YOLO系列算法的商品识别系统的完整实现方案,涵盖算法原理、数据集构建、模型训练、系统集成和可视化界面开发。通过对比YOLOv5到YOLOv8各版本性能差异,我们构建了一个高效、准确且用户友好的商品识别系统,并提供完整的代码实现。

YOLO 286

linux内核中max宏奥妙何在,LINUX内核中min和max宏的学习

add linux kernel min, max define:include/linux/kernel.h/** min()/max() macros that also do* strict type-checking.. See the* "unnecessary" pointer comparison.*/#define min(x,y) /(__extension__/({ /type...

weixin_29360387的博客 341

【Claude Code 源码解析教程】总体大纲

本教程旨在深入解析 Anthropic Claude Code 项目的源码架构和实现细节。Claude Code 是一个基于 TypeScript + Bun 构建的 AI 编程助手 CLI 工具,代号 "Tengu",具有复杂的多模块架构和丰富的功能特性。本教程基于Claude Code 的源码分析来生成,将帮助您全面掌握 Claude Code 的源码架构和实现细节,为开发类似 AI 编程助手工具奠定坚实基础。

rengang66的博客 387

Linux内核微观设计——语句表达式和max/min/container_of宏(学习了!!!)

语句表达式的定义 GNU C 对 C 标准作了扩展,允许在一个表达式里内嵌语句,允许在表达式内部使用局部变量、for 循环和 goto 跳转语句。这样的表达式,我们称之为语句表达式。语句表达式的格式如下: ({ 表达式1; 表达式2; 表达式3; }) 语句表达式最外面使用小括号()括起来,里面一对大括号{}包起来的是代码块,代码块里允许内嵌各种语句。语句的格式可以是 “表达式;”这种一...

u011298001的博客 389

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如果没有typeof,内核将会怎样?

<br />一直都觉得双向链表在内核中非常重要。<br />双向链表最主要的就是用了container_of这个宏。<br />而container_of又是建立在typeof的基础之上的。<br />没有typeof,就没有container_of,双向链表,就没有max,mix这些宏,就没有...<br />linux内核将typeof已经发挥到极致了。<br />container_of中包含的面向对象的思想。<br />min,max包含的泛型设计的思想。<br />C++所推崇的两大思想在linu

7508

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言宏定义-max、min宏再看Linux内核问题演进

C语言宏定义-max、min宏再看Linux内核严谨性 文章目录C语言宏定义-max、min宏再看Linux内核严谨性1. 简介2. `__COUNTER__`宏3. 相关宏 1. 简介 1) 通常我们经常使用如下宏判断返回X、Y的最小值或者最大值 #define min(X, Y) ((X) < (Y) ? (X) : (Y)) #define max(X, Y) ((X) < (Y) ? (Y) : (X)) 宏参数可能被重复调用的问题:例如 next=min(++a,1),宏被展开

vvvlan的博客 1964

linux c max函数头文件,Linux内核中是怎么实现min和max函数

Linux内核代码有很多很经典的代码,仔细去看看,可以学到很多知识。今天说说Linux是怎么实现min和max的。max和min函数都是比较常用的,可以用函数,或者利用宏去实现,一般我们会这样去写: #define min(x,y) ((x)>(y)?(y):(x))#define max(x,y) ((x)>(y)?(x):(y))但是上面的写法是有副作用的。比如输入 minval...

weixin_42513269的博客 2556

linux中minmax函数,linux内核中的min、max函数

这些天为了整理一下前段时间看ldd3时所学的驱动知识,所以就去看了看usb驱动。不看不知道,一看吓一跳,里面有很多语法我发现用的太好了,不像我们平时那样写代码。里面写的代码真是太好了。然而要理解到里面的东西还是不容易的。今天看见usb_stor_access_xfer_buf函数的时候,想看看里面的min 函数是不是按照我们写的那么写。但是一看傻啦,还有些东东我还没用过,于是赶紧google一下,...

weixin_39837124的博客 552

Linux:从min宏开始入手LKM

引言 本学期开了陈老师的OS课程,作业比较丰富。对于我这种放飞自我的人来说,作业是“选做 = 不做,必做 = 乱做”的,但是点进去任务的页面,稍微看了一眼觉得挺感兴趣的,也有一点点自己的小问题,决定记录一下。 任务如下: 任务详情 搭建Linux环境,编写Linux内核模块,二选一或者都做 1.编写Linux内核模块,并求最大数,参考,https://mp.weixin.qq.com/s/0ZVNbTj7fGs8Gi03vj541A和 https://mp.weixin.qq.com/s/Kvle_fgr

NiGo的博客 2235

内核怎么定义min和max宏

 以定义宏举例,一般都是以下形式: #define min(x,y) ((x)>(y)?(y):(x)) #define max(x,y) ((x)>(y)?(x):(y)) 但是上面的写法是有副作用的。比如输入: minval = min(x++, y); 替换宏之后,代码变成: minval = ((x++)>(y)?(y):(x++)) 可以看出,如果x是最小值,那

what, when, why, how... 1100

linux中min函数用法,linux内核中的min、max函数

这些天为了整理一下前段时间看ldd3时所学的驱动知识,所以就去看了看usb驱动。不看不知道,一看吓一跳,里面有很多语法我发现用的太好了,不像我们平时那样写代码。里面写的代码真是太好了。然而要理解到里面的东西还是不容易的。今天看见usb_stor_access_xfer_buf函数的时候,想看看里面的min 函数是不是按照我们写的那么写。但是一看傻啦,还有些东东我还没用过,于是赶紧google一下,...

weixin_29351901的博客 1891

Linux内核中的Min和Max函数

今天看代码时看到一个有趣的东东,就是linux内核也有min函数,但它的实现很是奇怪,先贴出来: /* * min()/max() macros that also do * strict type-checking.. See the * "unnecessary" pointer comparison. */ #define min(x,y) ({ typeof(x) _x = (

格物致知 3526

linux 中的min 和 max 比我写的要好

<br />1、min 和 max<br />/*<br /> * min()/max() macros that also do<br /> * strict type-checking.. See the<br /> * "unnecessary" pointer comparison.<br /> */<br />1   #define min(x,y) ({ /<br />2   typeof(x) _x = (x); /<br />3   typeof(y) _y = (y); /<br />4 

cahu的专栏 537

Linux内核中是怎么实现min和max函数

Linux内核代码有很多很经典的代码,仔细去看看,可以学到很多知识。今天说说Linux是怎么实现min和max的。max和min函数都是比较常用的,可以用函数,或者利用宏去实现,一般我们会这样去写: 1 #define min(x,y) ((x)>(y)?(y):(x)) 2 #define max(x,y)

zhangjikuan的专栏 2877

c语言宏swap,【C语言】Linux内核源码--min,swap宏定义

Linux3.5的部分宏定义在linux-3.5/include/linux/kernel.h的头文件中有定义一: 最大值和最小值相关的宏/** min()/max()/clamp() macros that also do* strict type-checking.. See the* "unnecessary" pointer comparison.*/#define min(x, y) (...

weixin_39563722的博客 375

Linux kernel中常见的宏整理

0x00 宏的基本知识 // object-like #define宏名 替换列表 换行符 //function-like #define宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识符列表都是将字符串token化以后的列表。区别在于标识符列表使用,作为不同参数之间的分割符。每一个参数都是一个 token化的列表。在宏中空白符只起到分割tok...

lyh290188的博客 1955
上一篇: 程序占用的内存分配
下一篇: 进程和线程的差别
opah521
博客等级 码龄18年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值