宏元编程

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

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

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

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

 #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) 

这是因为在function宏扩展期间如何处理参数。 ##连接运算符可防止参数扩展,因此必须通过添加另一个“层”来“强制”扩展。