宏元编程

Ide*_*Hat 3 c c-preprocessor

我知道这可能是不好的或不可能的,但是由于这不是递归宏,所以我认为应该是可能的。

#define FOO 15
#define MAKE_BAR(x) BAR_##x
#define MY_FOO_BAR MAKE_BAR(FOO)
Run Code Online (Sandbox Code Playgroud)

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

Dre*_*wen 5

您需要另一级宏调用:

#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)
Run Code Online (Sandbox Code Playgroud)

这是因为在功能宏扩展期间如何处理参数。所述##并置运算符防止参数扩展,所以通过添加另一“层”你必须“力”扩张。