标准 C 或 GNU 扩展中是否有任何方法可以将内容附加到宏定义中? 例如,给定一个定义为的宏,
#define List foo bar
我可以追加bas
它以便List
像我定义它一样扩展它
#define List foo bar bas
吗?
我希望我能做这样的事情:
#define List foo bar bas
#define List_ Expand(List)
#undef List
#define List Expand(List_) quux
但我不知道如何定义Expand()
宏,所以它会做我想做的事。
动机: 我正在与这些受歧视/标记的工会打交道:
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;
};
我认为这是 X-macro 的好地方。如果我定义一个宏
#define quux_table X(foo) X(bar) X(bas)
,则可以这样定义枚举和结构,并且永远不会不同步:
#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
当然,quux_*
结构可能会不同步,所以我想做这样的事情,只是合法的:
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)
(好吧,我真正想做的是,
member_struct(quux, foo) { int x; };
但我很清楚不能从宏中(重新)定义宏。)
无论如何,这是我的激励例子。有没有办法做到这一点?
Boost.Preprocessor 示例很好,如果您能告诉我如何使 X-macro 技术与该库一起工作。