typestar

_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

  1. El tipo de la expresión de control elige la rama.
  2. No se evalúa nada excepto la rama seleccionada.
  3. Así despacha tgmath.h entre float y double.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 1 de 2 en Válvulas de escape; paso 11 de 13 en Uniones, campos de bits y comportamiento indefinido.

← Anterior Siguiente →