MIN and MAX in C
Where are
MIN
andMAX
defined in C, if at all?
They aren't.
What is the best way to implement these, as generically and type safe as possible (compiler extensions/builtins for mainstream compilers preferred).
As functions. I wouldn't use macros like #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
, especially if you plan to deploy your code. Either write your own, use something like standard fmax
or fmin
, or fix the macro using GCC's typeof (you get typesafety bonus too) in a GCC statement expression:
#define max(a,b) \ ({ __typeof__ (a) _a = (a); \ __typeof__ (b) _b = (b); \ _a > _b ? _a : _b; })
Everyone says "oh I know about double evaluation, it's no problem" and a few months down the road, you'll be debugging the silliest problems for hours on end.
Note the use of __typeof__
instead of typeof
:
If you are writing a header file that must work when included in ISO C programs, write
__typeof__
instead oftypeof
.
It's also provided in the GNU libc (Linux) and FreeBSD versions of sys/param.h
, and has the definition provided by dreamlax.
On Debian:
$ uname -srLinux 2.6.11$ cat /etc/debian_version5.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 GNUThis file is part of the GNU C Library.
On FreeBSD:
$ uname -srFreeBSD 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))
The source repositories are here:
There's a std::min
and std::max
in C++, but AFAIK, there's no equivalent in the C standard library. You can define them yourself with macros like
#define MAX(x, y) (((x) > (y)) ? (x) : (y))#define MIN(x, y) (((x) < (y)) ? (x) : (y))
But this causes problems if you write something like MAX(++a, ++b)
.