what macro c macros c-preprocessor

what - gcc macros



Agregar 0s a una lista incompleta de parĂ¡metros de macro (2)

Encontré una solución de hack-ish:

#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4 #define FILL_PARAMS(...) TAKE4( __VA_ARGS__ + 0, 0, 0, 0, 0)

Eso funciona con al menos los siguientes casos de prueba.

int i = 120; printf("%d/t%d/t%d/t%d/n", FILL_PARAMS()); printf("%d/t%d/t%d/t%d/n", FILL_PARAMS(i)); printf("%d/t%d/t%d/t%d/n", FILL_PARAMS(1)); printf("%d/t%d/t%d/t%d/n", FILL_PARAMS(1, 2)); printf("%d/t%d/t%d/t%d/n", FILL_PARAMS(1, 2, 3)); printf("%d/t%d/t%d/t%d/n", FILL_PARAMS(1, 2, 3, 4)); printf("%d/t%d/t%d/t%d/n", FILL_PARAMS(1, 2, 3, i));

Tengo las siguientes macros de preprocesador C que utilizo:

#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4 #define FILL_PARAMS(...) TAKE4(__VA_ARGS__, 0, 0, 0, 0)

Cuando se llama a FILL_PARAMS con 1, 2 o 3 parámetros, los últimos (no especificados) se convierten en 0 como se esperaba, pero cuando no se dan argumentos, se produce un error.

¿Hay alguna manera de agregar soporte para no-parameters?

Aclaración:
Actualmente se admiten los siguientes usos:

FILL_PARAMS(1) // => 1, 0, 0, 0 FILL_PARAMS(1, 2) // => 1, 2, 0, 0 FILL_PARAMS(1, 2, 3) // => 1, 2, 3, 0

Y quiero agregar soporte para el siguiente caso extremo:

FILL_PARAMS() // => 0, 0, 0, 0

Ayuda será bienvenida.


Puede lograr esto de múltiples maneras, la manera más simple es usar

FILL_PARAMS(0)

como el caso vacío.

Otra forma, más complicada y engorrosa de usar es tener siempre la coma siguiendo el último parámetro:

#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4 #define FILL_PARAMS(...) TAKE4(__VA_ARGS__ 0, 0, 0, 0) /* called like: */ FILL_PARAMS() FILL_PARAMS(1,) FILL_PARAMS(1,2,) FILL_PARAMS(1,2,3,)

O al ser un poco creativo con la extensión para tragar coma de GCC:

#define TAKE4(a1, a2, a3, a4, a5, ...) a2, a3, a4, a5 #define FILL_PARAMS(...) TAKE4(0, ##__VA_ARGS__, 0, 0, 0, 0)