C语言中的MIN和MAX定义在哪里?
实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)
C语言中的MIN和MAX定义在哪里?
实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)
当前回答
看起来像Windef.h (a la #include <windows.h>)有max和min宏(小写),这也遭受了“双重求值”的困难,但它们是为那些不想重新滚动自己的:)
其他回答
我将避免同时将MIN和MAX定义为预处理器宏。 即使改进了实现,避免了双重评估,即。
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
当您尝试在函数之外使用此函数(参见这里的示例)或在此答案中引用的变量阴影时,您会遇到其他问题,例如编译器错误。
如果你迫切需要宏所带来的性能优势,即代码内联,可以将它们实现为内联函数。大多数现代编译器都支持内联。比如像这样
inline int32_t MAX(int32_t a, int32_t b) { return((a) > (b) ? a : b); }
inline int32_t MIN(int32_t a, int32_t b) { return((a) < (b) ? a : b); }
(更多)
你必须为你需要的每一种数据类型实现一个变体,但通常你会使用有限的一组数据类型。话虽如此,请记住比较浮点数有它自己的怪癖,你需要比上面更复杂的代码(参见这里的讨论)。
我不认为它们是标准化宏。浮点数已经有了标准化的函数,fmax和fmin (fmaxf用于浮点数,fmaxl用于长双精度浮点数)。
您可以将它们作为宏实现,只要您了解副作用/双重评估的问题。
#define MAX(a,b) ((a) > (b) ? a : b)
#define MIN(a,b) ((a) < (b) ? a : b)
在大多数情况下,你可以把它留给编译器来决定你要做什么,并尽可能优化它。虽然这在像MAX(i++, j++)这样使用时会产生问题,但我怀疑是否有必要一次性检查增量值的最大值。先递增,然后检查。
它也在GNU libc (Linux)和FreeBSD版本的sys/param.h中提供,并具有dreamlax提供的定义。
在Debian上:
$ uname -sr
Linux 2.6.11
$ cat /etc/debian_version
5.0.2
$ egrep 'MIN\(|MAX\(' /usr/include/sys/param.h
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
$ head -n 2 /usr/include/sys/param.h | grep GNU
This file is part of the GNU C Library.
在FreeBSD上:
$ uname -sr
FreeBSD 5.5-STABLE
$ egrep 'MIN\(|MAX\(' /usr/include/sys/param.h
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
源存储库在这里:
GNU C库 FreeBSD
如果你需要min/max来避免昂贵的分支,你不应该使用三元运算符,因为它会编译成一个跳转。下面的链接描述了实现最小/最大函数而不进行分支的有用方法。
http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
值得指出的是,如果你用三元运算来定义最小值和最大值,比如
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
然后,为了在fmin(-0.0,0.0)和fmax(-0.0,0.0)的特殊情况下获得相同的结果,您需要交换参数
fmax(a,b) = MAX(a,b)
fmin(a,b) = MIN(b,a)