Linux内核代码中max和min宏的实现以及语句表达是({})的应用

Linux内核代码中有很多比较精巧的程序设计技巧,include/linux/kernel.h中实现max和min宏就是其中的一部分。

我们先来看一下普通的max和min一般怎么写:

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

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

但这么写有一个小风险,请看以下调用:

int x = 2;y = 1

printf("%d/n", max(x++, y++)); 

调用结束后会发现,x被加了2,主要是因为max被展开后如下:

((x++) > (y++) ? (x++) : (y++))

很明显,这么做是不安全的,那我们来看Linux Kernel是如何做的:

#define max(x, y) ({                \
    typeof(x) _max1 = (x);          \
    typeof(y) _max2 = (y);          \
    (void) (&_max1 == &_max2);      \
    _max1 > _max2 ? _max1 : _max2; })

这么做主要涉及以下几个知识点:

1、typeof(x)

找出x的数据类型

2、语句表达是({S1;S2;...;Sn;})

总的语句表达是的值是Sn,这个技巧我之前写代码是也用到过,呵呵

3、(void) (&_x == &_y);的巧妙

这个主要是用来判断x,y数据类型是否一样,利用了编译器的一个小特性:不同数据类型的变量进行比较时会产生Warning,如果Makefile比较严格的话,会产生Error

关于这一点,很多人写,但都没写到点子上,以下几篇都很好:

http://www.armfans.net/thread-1527-1-1.html

http://my.oschina.net/pathenon/blog/63492

http://www.wypblog.com/archives/237

收藏于 2013-09-07

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏超然的博客

JSON 和 JSONP 两兄弟

  但说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?

893
来自专栏杨熹的专栏

2 天入门 Java-Day 2

第二天的课程明显就比第一天的要难了,? 表示很吃力,脑子不够用的节奏。 各种概念绕来绕去,脑袋都要绕成了壳。 不过还好没有放弃,想个办法画出各概念间的联系,...

3269
来自专栏hrscy

202 - Swift 的核心是什么?

不知道大家有没有看过 WWDC 2015 的视频,其中有一个编号为 408 的视频解释了这个问题,下面是视频链接:Protocol-Oriented Progr...

812
来自专栏Web项目聚集地

Javascript中的异步

632
来自专栏我和PYTHON有个约会

09.程序编程基础3~组合数据类型

python中为了方便一部分相似数据的处理,提供了各种组合类型,常见的如列表、元组 python中的列表是可变序列,元组是不可变序列

491
来自专栏程序猿DD

程序员你为什么这么累【续】:编码习惯之工具类规范

一个项目不可能没有工具类,工具类的初衷是良好的,代码重用,但到了后面工具类越来越乱,有些项目工具类有几十个,看的眼花缭乱,还有不少重复。如何编写出好的工具类,我...

2076
来自专栏代码GG之家

android MVVM开发模式(二)

举手之劳,帮忙分享出去,让更多热爱编程的人加入进来。 简介 之前讲了那么多,主要围绕着这个核心概念:绑定。 不过相对来说,我们上节讲的其实只是它的一个知识点:解...

1907
来自专栏java一日一条

2017年高频率的互联网校园招聘面试题

参加了2017年校招,面试了阿里、百度、腾讯、滴滴、美团、网易、去哪儿等公司,个人是客户端 Android 方向,总结了面试过程中频率出现较高的题目,希望对大家...

862
来自专栏WindCoder

网易MySQL微专业学习笔记(一)-mysql数据类型

这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。

511
来自专栏青玉伏案

代码重构(六):代码重构完整案例

无论做什么事情呢,都要善始善终呢。前边连续发表了5篇关于重构的博客,其中分门别类的介绍了一些重构手法。今天的这篇博客就使用一个完整的示例来总结一下之前的重构规则...

2277

扫码关注云+社区