【发布时间】:2022-01-17 10:54:09
【问题描述】:
我正在为一种编程语言定义一个词法分析器。其中一部分涉及拥有一个关键字和标记表:
#define FOREACH_KEYWORD(V) \
V(And, and) \
V(Else, else) \
V(False, false) \
V(If, if) \
V(Or, or) \
V(True, true)
#define FOREACH_TOKEN(V) \
V(Plus) \
V(Minus) \
V(Times) \
V(Div) \
FOREACH_KEYWORD(V)
这些宏的用途是这样的:
const char *kTokenTypeNames[] = {
#define STR(NAME) #NAME,
FOREACH_TOKEN(STR)
#undef STR
};
// which would ideally expand to
const char *kTokenTypeNames[] = {
"Plus", "Minus", "Times", "Div", "And", "Else", "False", "If", "Or", "True",
};
并且关键字应该包含在令牌列表中。上面的伪代码不起作用,因为两个不同的V 宏参数有不同的arities。我希望任何必须处理标记的宏只需要采用 1 个参数,而任何处理关键字的宏都需要采用 2。我宁愿不要让所有内容都可变。我觉得应该可以添加一些插页式宏来实现这种组合,但我还没有足够聪明来实现这一点。
我想,一般来说:我希望能够采用 N 的 X 宏并将其减少到某个 M,其中 M 小于 N。
我怎样才能做到这一点?
【问题讨论】:
-
不清楚预期的输出是什么。换句话说,假设存在一些
V完全符合您的要求,那么V究竟会做什么? -
可以是任何东西——我会修改一个示例使用
-
我想你只需要
#define STR(NAME, ...) #NAME, -
这不能解决
FOREACH_TOKEN中的FOREACH_KEYWORD,是吗? -
请为所示示例显示您希望看到的预处理器扩展输出。 IE。手动编写您想要的结果。这将有助于猜测你的目标是什么。请提供所需的输出,而不是仅仅试图再次解释它。
标签: c macros c-preprocessor