The joy of max
这篇文章给出了最近的一次 Linux 内核的 max()
宏的实现,我们可以看到它和我们在 C 语言教材上入门的实现有多大的区别。
- 这段代码视图解决的问题在这个的 Patch 中可以查看: PATCH v6 kernel.h: Retain constant expression output for max()/min(),简单来说,是想要让
max(a, b)
返回常量表达式,而非常量值。 - 关于 __builtin_choose_expr, 这是 GCC 的一个 builtin funcion,可以在
__builtin_choose_expr (const_exp, exp1, exp2)
的const_exp
值为 整型常量时返回exp1
,否则exp2
. - 评论区有人给出了 remarkably sane and readable 的评价, 我认为确实没办法一眼看懂但稍微看一会儿也就看懂了,代码确实还蛮好读的。
- 评论区还有个人问为什么非要这么写,有个回复蛮有意思:写出这样的代码需要对 C standard 阅读得非常仔细(例如
(int *)0
其实是 (void *)),此外还要对大量的 GCC 做测试。需要知道编译器不同版本不同实现对标准有不同的行为,这些都要被考虑到。
衍生思考:这种级别的基础代码在现在还在不断演化,说明软件行业的边界 Case 真是非常多。好好看文档,多做测试,多思考使用场景,是写出好代码的必备条件。