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
og
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
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 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 -pedantic
Soy demasiado exigente para mi propio bien.
Editar: 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.