【发布时间】:2021-02-11 22:52:59
【问题描述】:
我想更改一个广泛使用的 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 的方法吗?比如:
#define BAR bar
MY_MACRO_NEW(MACRO_EVAL(BAR));
谢谢!
【问题讨论】:
-
总是很高兴阅读the manual(这是 gcc 手册,所以请根据口味调整)。那里解释了这一点:如果要对宏参数的扩展结果进行字符串化,则必须使用两个级别的宏。 接下来是一个具体示例。你的用例可以接受吗?
-
#define MY_MACRO_NEW(x) MY_MACRO_NEW_(x)和#define MY_MACRO_NEW_(x) (foo(#x))解决您的问题了吗? -
谢谢马修斯,正是我想要的!
标签: c string macros c-preprocessor