#define MAY(_y) \
({ \
typeof (_y) _x = (_y); may_t _z = \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(_x), signed int), \
MAY_SLONG (*(signed long*)&_x), \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(_x), unsigned int),\
MAY_ULONG (*(unsigned long*)&_x), \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(_x), signed long), \
MAY_SLONG (*(signed long*)&_x), \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(_x),unsigned long),\
MAY_ULONG (*(unsigned long*)&_x), \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(_x), mpz_t), \
MAY_MPZ (*(mpz_t*)&_x), \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(_x), mpq_t), \
MAY_MPQ (*(mpq_t*)&_x), \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(_x), mpfr_t), \
MAY_MPFR (*(mpfr_t*)&_x), \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(_x), long double), \
MAY_LONG_DOUBLE (*(long double*)&_x), \
__builtin_choose_expr (__builtin_types_compatible_p (typeof (_x), double), \
MAY_DOUBLE (*(double*)&_x), \
__builtin_choose_expr (__builtin_types_compatible_p (typeof (_x), float), \
MAY_DOUBLE (*(double*)&_x), \
__builtin_choose_expr (__builtin_types_compatible_p (typeof (_x), char []), \
MAY_STRING (*(char**)&_x), \
__builtin_choose_expr (__builtin_types_compatible_p (typeof (_x), char *), \
MAY_STRING (*(char**)&_x), \
__builtin_choose_expr (__builtin_types_compatible_p (typeof (_x), may_t), \
(_x), \
/* The void expression results in a compile-time error \
when assigning the result to something. */ \
(void)0))))))))))))); \
_z; })
Non, il n'y a rien en trop.
Meme si l'utilisation de _z n'est pas indispensable
(Je vous passe les definition des constructeurs specialises
)

En l'occurence, __builtin_types_compatible_p (typeof (1.2), char *) == 0, non?
!
