宏元编程

时间:2014-08-15 18:26:02

标签: c c-preprocessor

我知道这可能是坏的或不可能的,但由于这不是一个递归的宏,我认为它应该是可能的。

#define FOO 15
#define MAKE_BAR(x) BAR_##x
#define MY_FOO_BAR MAKE_BAR(FOO)

我希望MY_FOO_BAR评估为BAR_15。有没有办法告诉预处理器在将FOO传递给MAKE_BAR之前评估FOO?

1 个答案:

答案 0 :(得分:4)

您需要另一级别的宏调用:

#define FOO 15
#define MAKE_BAR_INNER(x) BAR_##x
#define MAKE_BAR(x) MAKE_BAR_INNER(x)
#define MY_FOO_BAR MAKE_BAR(FOO)

这是因为在功能宏扩展期间如何处理参数。 ##连接运算符可以防止参数扩展,因此您必须强制使用"强制"通过添加另一个"层"扩展。