Implementando min () y max () en Clang sin doble evaluación

La versión clásica de preprocesador de lamin la función parece

#define min(a, b) ((a) < (b) ? (a) : (b))

Esto te deja abierto a una doble evaluación, la situación en la que lo haces.min(f(), g())olvidando esof&nbsp;og&nbsp;tiene efectos secundarios, y tiene que pasar horas tratando de averiguar por qué su función se ejecuta dos veces. Para evitar esto, puedes hacer

#define min(a, b) ({__typeof__(a) _a = (a); \
    __typeof__(b) _b = (b); \
    _a < _b ? _a : _b;})

Esto funciona muy bien bajo GCC, pero si lo ejecutas a través de Clang con-Wgnu&nbsp;conjunto, este conjunto de advertencias cae bajo el paraguas de-pedantic—Tienes errores como

test.c:5:10: error: use of GNU statement expression extension [-Werror,-Wgnu]
        int a = min(3, 7);
                ^
test.c:1:22: note: expanded from macro 'min'
#  define min(a, b) ({__typeof__(a) _a = (a); __typeof__(b) _b = (b); _a < _b ? _a : _b;})

¿Es posible definir estas macros de una manera que impida la doble evaluación?y&nbsp;que es aceptable para Clang bajo-pedantic? (Sí, puede desactivar la advertencia con-Wno-gnu, en cuyo caso Clang maneja la expresión de la declaración sin problemas. Lo pregunto porque yo, comoclang -pedanticSoy demasiado exigente para mi propio bien.

Editar:&nbsp;Estoy trabajando en C. También etiqueté este C ++ porque pensé que una solución podría aplicarse a C ++, así como a C. ¡Vaya! ¡Olvidé las plantillas! Lo siento por la ambigüedad.