我知道这可能是坏的或不可能的,但由于这不是一个递归的宏,我认为它应该是可能的。
#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?
答案 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)
这是因为在功能宏扩展期间如何处理参数。 ##
连接运算符可以防止参数扩展,因此您必须强制使用"强制"通过添加另一个"层"扩展。