C中的强制宏评估

时间:2021-02-11 22:52:59

标签: c string macros c-preprocessor

我想改变一个广泛使用的 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);

由于 MY_MACRO_NEW 使用 # 进行字符串化,因此不会评估 BAR,因此结果字符串将是 BAR 而不是所需的 bar。

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

你可以使用一个什么都不做的宏来传递一个循环。

<script src="https://d3js.org/d3.v6.min.js"></script>
<svg width="1000" height="500"></svg>

输出:

#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;
}

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