我想改变一个广泛使用的 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));
谢谢!
答案 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;
}
如果您的评估需要一个以上的扩展周期,您将需要更多的虚拟宏。