【发布时间】:2015-04-26 05:14:08
【问题描述】:
使用 c11 _Generic 有没有办法将多种类型映射到单个值?
例如:
_Generic(e, \
A *: foo_expression, \
B **: foo_expression, \
C: foo_expression, \
enum D: bar_expression, \
void *: bar_expression)
有没有办法对类型进行分组? (这不是表达意图的有效语法)
_Generic(e, \
A *: B **: C: foo_expression, \
enum D: void *: bar_expression)
我问的原因是 args foo 和 baz 最终可能是大型表达式(不一定可以重构为函数),因此可以避免大量重复会很好。
注意:
如果不支持使用_Generic 的方式,我_可以_ 制作一个可变参数宏将多个参数粘合到一个值...
#define GENERIC_TYPE_GLUE3(answer, arg0, arg1) \
arg0: answer, arg1: answer
#define GENERIC_TYPE_GLUE4(answer, arg0, arg1, arg2) \
arg0: answer, arg1: answer, arg2: answer
....
... 有很多这样的宏,然后使用 varargs 包装器来自动使用正确的,请参阅:https://stackoverflow.com/a/24837037/432509
_Generic(e, \
GENERIC_TYPE_GLUE(foo_expression, short int, long),
GENERIC_TYPE_GLUE(bar_expression, float, double))
(参见工作示例:https://gist.github.com/ideasman42/4426f255880ff6a53080)
【问题讨论】:
-
我从来没有真正研究过通用宏是如何工作的,但是如果你为巨大的
foo和baz表达式定义了新的宏呢?有什么东西阻止了它的工作吗? -
这在大多数情况下都有效,它只是意味着一次性宏的数量可能会成倍增加(并污染名称空间)。我宁愿使用示例宏将多个类型与单个 arg 粘合在一起。
标签: c generics generic-programming c11