我相信标题是不言自明的,但这里有一个例子来说明我想要完成的事情:
#define PASTE2(_0, _1) _0 ## _1
#define DEFINE_OPS_FOR_TYPE(TYPE) \
int PASTE2(do_something_with_, TYPE)(void) { \
/* do_something_with_<TYPE> */ \
}
一切都适用于char
、int
和单字类型,但是当涉及到unsigned
类型或其他具有多个关键字的类型时,a ## b
由于空格(例如:),使用标记粘贴 ( ) 不会生成有效名称do_something_with_foo bar
。
我能想到的最简单的解决方案是更改DEFINE_OPS_FOR_TYPE
宏以将有效名称作为第二个参数。例如:
#define DEFINE_OPS_FOR_TYPE(TYPE, NAME_FOR_TYPE) \
int PASTE2(do_something_with_, NAME_FOR_TYPE)(void) { \
/* do_something_with_<NAME_FOR_TYPE> */ \
}
这按预期工作,但我对其他可能的解决方案很好奇,即使它们过于复杂。我想过使用_Generic
,但我看不出它对定义名称有何帮助。
你能想出另一种解决方案吗?