我相信标题是不言自明的,但这里有一个例子来说明我想要实现的目标:
#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 栏
)。
我能想到的最简单的解决方案是更改 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
,但我不明白它对定义名称有什么帮助。
你能想到另一种解决方案吗?
最佳答案
在您想要执行的符号的声明或定义级别上,没有太多方法可以将事物 typedef
转换为相关类型的唯一标识符。 _Generic
或等效替代品启动得太晚,对预处理器没有用处。
但是只有有限数量的标准类型会造成这样的问题。所以你可以很容易地想出一个约定来定义它们的类型。
_Generic
可以提供帮助的是此类定义符号的使用方面。然后你可以在这里做类似的事情
_Generic((X),
unsigned long: do_something_with_ulong,
unsigned char: do_something with_uchar,
...
)(X)
在 P99我遵循这个方案,你会发现很多支持宏已经就位。
关于c - 宏如何根据传递给它的类型定义有效的全局名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14137291/