在 C 中强制进行宏评估

force macro evaluation in C

我想更改一个广泛使用的 C 宏,该宏现在将字符串作为参数,以仅采用不带引号的字符串名称。然后,我将使用 # 将宏中的名称字符串化。我希望更改易于用户适应(在最简单的情况下删除引号)。

宏示例,更改自:

#define MY_MACRO(x) (foo(x))

#define MY_MACRO_NEW(x) (foo(#x))

问题是有时使用宏作为参数而不是直接使用字符串,像这样:

#define BAR "bar"
MY_MACRO(BAR);

如果去掉引号,修改宏:

#define BAR bar
MY_MACRO_NEW(BAR);

BAR 将不会被评估,因为 MY_MACRO_NEW 使用 # 进行字符串化,因此生成的字符串将是 BAR 而不是所需的柱。

这是一种在 MY_MACRO_NEW 评估 BAR 之前强制评估 BAR 的方法吗?类似于:

#define BAR bar
MY_MACRO_NEW(MACRO_EVAL(BAR));

谢谢!

您可以使用不执行任何操作的宏来传递循环。

#include <stdio.h>

#define MY_MACRO_NEW(x) MY_MACRO_NEW_(x)
#define MY_MACRO_NEW_(x) (foo(#x))

void foo(const char *msg) {
    printf("%s\n", msg);
}

#define BAR bar

int main() {
    MY_MACRO_NEW(BAR);
    return 0;
}

输出:

bar

如果您的评估需要一个以上的扩展周期,您将需要更多的虚拟宏。