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