Agregar 0s a una lista incompleta de parámetros de macro




c macro function (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.


Answer #1

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)




c-preprocessor