_Generic en C
La selección por tipo de C11: un nombre de macro, una llamada distinta por tipo.
#include <stdio.h>
#define TYPE_NAME(x) _Generic((x), \
int: "int", \
long: "long", \
double: "double", \
char *: "char *", \
default: "something else")
#define ABS(x) _Generic((x), int: abs_int, double: abs_double)(x)
static int abs_int(int v) {
return v < 0 ? -v : v;
}
static double abs_double(double v) {
return v < 0.0 ? -v : v;
}
void dispatch(void) {
printf("%s %s %s\n", TYPE_NAME(1), TYPE_NAME(1.0), TYPE_NAME("text"));
printf("%d %.1f\n", ABS(-3), ABS(-2.5));
}
Cómo funciona
- El tipo de la expresión de control elige la rama.
- No se evalúa nada excepto la rama seleccionada.
- Así despacha tgmath.h entre float y double.
Palabras clave y builtins usados aquí
doubleintreturnstaticvoid
El intento, en números
- Líneas
- 23
- Caracteres a escribir
- 476
- Tokens
- 100
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 55 segundos.
Paso 1 de 2 en Válvulas de escape; paso 11 de 13 en Uniones, campos de bits y comportamiento indefinido.