¿Hay alguna forma en C estándar o con extensiones GNU para agregar cosas a una definición de macro? P.E., dada una macro definida como
#define List foo bar
puedo añadir bas
para que List
se expande como si hubiera definí
#define List foo bar bas
?¿Puedo agregar a una macro de preprocesador?
Tenía la esperanza de que pudiera hacer algo como esto:
#define List foo bar bas
#define List_ Expand(List)
#undef List
#define List Expand(List_) quux
pero no puedo encontrar la manera de definir la macro Expand()
lo que debes de hacer lo que quiera.
motivación: estoy jugando con discriminado/tagged sindicatos a lo largo de estas líneas:
struct quux_foo { int x; };
struct quux_bar { char *s; };
struct quux_bas { void *p; };
enum quux_type {quux_foo, quux_bar, quux_bas};
struct quux {
enum quux_type type;
union {
struct quux_foo foo;
struct quux_bar bar;
struct quux_bas bas;
} t;
};
Calculo que este es un buen lugar para el X-macro. Si defino una macro
#define quux_table X(foo) X(bar) X(bas)
la estructura de enumeración & se puede definir de este modo, y nunca perder la sincronización:
#define X(t) quux_ ## t,
enum quux_type {quux_table};
#undef X
#define X(t) struct quux_ ## t t;
struct quux {
enum quux_type type;
union {quux_table} t;
};
#undef X
Por supuesto, las estructuras quux_*
pueden perder la sincronización, así que me gustaría a hacer algo como esto, solamente legalmente:
struct quux_foo { int x; };
#define quux_table quux_table X(foo)
struct quux_bar { char *s; };
#define quux_table quux_table X(bar)
struct quux_bas { void *p; };
#define quux_table quux_table X(bas)
(Bueno, lo que realmente quiero ser capaz de hacer es algo así como
member_struct(quux, foo) { int x; };
pero soy muy consciente de que las macros no pueden ser (re) definido dentro de las macros.)
De todos modos, eso es mi ejemplo motivador. ¿Hay alguna manera de lograr esto?
Los ejemplos de Boost.Preprocessor están bien, si puede mostrarme cómo hacer que la técnica X-macro funcione con esa biblioteca.
Sí, esto es definitivamente factible, si no insistes en la redefinición Algo doloroso si usas el preprocesador en bruto. Algo menos doloroso con Boost.Preprocessor. Por desgracia, mi frío me impide pensar lo suficiente como para producir un método. Con suerte, alguien más lo hará. – swestrup