Gibt es in Standard-C - oder mit GNU-Erweiterungen - eine Möglichkeit, etwas an eine Makrodefinition anzuhängen? z.B. mit einem Makro, das wie folgt definiert ist
#define List foo bar
kann ich anhängen bas
so dass es List
dehnt sich aus, als ob ich es definiert hätte
#define List foo bar bas
?
Ich hatte gehofft, dass ich so etwas tun könnte:
#define List foo bar bas
#define List_ Expand(List)
#undef List
#define List Expand(List_) quux
aber ich kann nicht herausfinden, wie ich die Expand()
Makro, damit es das tut, was ich will.
Motivation: Ich spiele mit diskriminierten/markierten Gewerkschaften in diesem Sinne:
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;
};
Ich denke, dies ist ein guter Platz für den X-macro. Wenn ich ein Makro definiere
#define quux_table X(foo) X(bar) X(bas)
die Aufzählung und die Struktur können so definiert werden, ohne dass sie aus dem Gleichgewicht geraten:
#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
Natürlich ist die quux_*
Strukturen können aus dem Gleichgewicht geraten, deshalb würde ich gerne etwas Ähnliches machen, nur auf legale Weise:
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)
(Nun, was ich wirklich wollen in der Lage sein, etwas zu tun wie
member_struct(quux, foo) { int x; };
aber ich weiß sehr wohl, dass Makros nicht innerhalb von Makros (neu) definiert werden können).
Jedenfalls ist das mein motivierendes Beispiel. Gibt es eine Möglichkeit, dies zu erreichen?
Boost.Preprocessor Beispiele sind gut, wenn Sie mir zeigen können, wie die X-Makro-Technik mit dieser Bibliothek funktioniert.