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)