Gibt es eine Möglichkeit in Standard-C-oder mit GNU-Erweiterungen - Sachen an eine Makrodefinition anzuhängen? Zum Beispiel, ein Makro definiert als
#define List foo bar
kann ich bas
so anhängen gegeben, dass es List
wie erweitert, wenn ich es definiert hatte
#define List foo bar bas
?Kann ich an ein Präprozessor-Makro anhängen?
Ich hatte gehofft, ich 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 die Expand()
Makro zu definieren, so wird es das tun, was ich will.
Motivation: ich mit diskriminiert ich spiele/getaggt Gewerkschaften in diese Richtung:
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 meine, dies ist ein guter Ort für den X-Makro ist. Wenn ich ein Makro
#define quux_table X(foo) X(bar) X(bas)
die Aufzählung & Struktur definieren kann so definiert werden, und nie aus dem Takt 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 nicht synchron bekommen, so möchte ich so etwas zu tun, nur legal:
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)
(Na ja, was ich wirklich in der Lage sein will, ist, etwas zu tun wie
member_struct(quux, foo) { int x; };
aber ich bin mir durchaus bewusst, dass Makros nicht (wieder) definiert aus Makros sein kann.)
Wie auch immer, das ist mein Motivations Beispiel. Gibt es einen Weg, dies zu erreichen?
Boost.Preprocessor Beispiele sind in Ordnung, wenn Sie mir zeigen können, wie die X-Makro-Technik mit dieser Bibliothek arbeiten.
Ja, das ist definitiv machbar, wenn Sie nicht auf Neudefinition bestehen. Etwas schmerzhaft, wenn Sie den rohen Präprozessor verwenden. Etwas weniger schmerzhaft mit Boost.Preprocessor. Ach, meine Erkältung verhindert, dass ich gerade genug nachdenke, um eine Methode zu entwickeln. Hoffentlich wird es jemand anderes tun. – swestrup