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 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

3017
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4425
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

5548
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.5K7
来自专栏落花落雨不落叶

canvas画简单电路图

89111
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3025
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

7426
来自专栏魂祭心

原 canvas绘制clock

5194
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

39510
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3715

扫码关注云+社区