C语言中的MIN和MAX定义在哪里?
实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)
C语言中的MIN和MAX定义在哪里?
实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)
当前回答
它也在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
其他回答
看起来像Windef.h (a la #include <windows.h>)有max和min宏(小写),这也遭受了“双重求值”的困难,但它们是为那些不想重新滚动自己的:)
值得指出的是,如果你用三元运算来定义最小值和最大值,比如
#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)
我知道那家伙说"C"… 但如果有机会,请使用c++模板:
template<class T> T min(T a, T b) { return a < b ? a : b; }
类型安全,其他注释中提到的++没有问题。
两个整数a和b的最大值是(int)(0.5((a+b)+abs(a-b)))。这也可以用于(double)和fabs(a-b)用于double(类似于float)
如果你需要min/max来避免昂贵的分支,你不应该使用三元运算符,因为它会编译成一个跳转。下面的链接描述了实现最小/最大函数而不进行分支的有用方法。
http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax