* Alejandro Colomar: > +.SH EXAMPLES > +The following program demonstrates how to write > +a replacement for the standard > +.BR imaxabs (3) > +function, which being a function can't really provide what it promises: > +seamlessly upgrading to the widest available type. > +.PP > +.\" SRC BEGIN (_Generic.c) > +.EX > +#include <stdint.h> > +#include <stdio.h> > +#include <stdlib.h> > + > +#define my_imaxabs(j) _Generic((intmax_t) 0, \e > + int: abs(j), \e > + long: labs(j), \e > + long long: llabs(j) \e > + /* long long long: lllabs(j) */ \e > +) The macro name does not really match what the function does. It's a type-generic abs function, not related to the max function or intmax_t. Note that this approach does not really work that well in practice because macros using _Generic expand all the alternatives (in current implementations; doing this differently requires deviating from the layered implementation strategy suggested in the C standard). This means that _Generic-using macros can only be nested maybe three or four levels deep, depending on the number of _Generic alternatives on each level. For <tgmath.h>, this is really not enough, so a high-quality implementation of <tgmath.h> using _Generic is not feasible. GCC provides __builtin_tgmath, which is designed in such a way that when used in a macro, the macro argument is only expanded once. Maybe mention this under BUGS? C++ templates do not suffer from this particular problem. Thanks, Florian