C Language Extensión: Da la macro X como argumento


Ejemplo

El enfoque de la X-macro se puede generalizar un poco al hacer que el nombre de la macro "X" sea un argumento de la macro maestra. Esto tiene las ventajas de ayudar a evitar colisiones de nombres de macro y de permitir el uso de una macro de propósito general como la macro "X".

Como siempre con las macros X, la macro maestra representa una lista de elementos cuyo significado es específico de esa macro. En esta variación, tal macro podría definirse así:

/* declare list of items */
#define ITEM_LIST(X) \
      X(item1) \
      X(item2) \
      X(item3) \
/* end of list */

Uno podría entonces generar un código para imprimir los nombres de los artículos de esta manera:

/* define macro to apply */
#define PRINTSTRING(value) printf( #value "\n");

/* apply macro to the list of items */
ITEM_LIST(PRINTSTRING)

Eso se expande a este código:

printf( "item1" "\n"); printf( "item2" "\n"); printf( "item3" "\n");

A diferencia de las macros X estándar, donde el nombre "X" es una característica incorporada de la macro maestra, con este estilo puede ser innecesario o incluso no deseable volver a definir la macro utilizada como argumento ( PRINTSTRING en este ejemplo).