有没有办法删除 C 宏中的引号

Is there a way to remove quotes in a C macro?

本文关键字:删除 有没有      更新时间:2023-10-16

假设我想取消字符串化宏参数,该参数应该将"text"转换为text

#define UN_STRINGIFY(x) /* some macro magic here */

现在调用此宏将从其参数中删除""

UN_STRINGIFY("text") // results in ----> text

这与宏字符串化相反:

#define STRINGIFY(x) #x

这可能吗,还是我在玩宏观邪恶?

是不可能的。这可能是一件好事:如果你传递一个字符串,你假设你可以把几乎所有东西都放进去。取消字符串化会突然导致编译器真正关心该字符串的内容。

我已经

多次提出这个问题,但仍然无法理解。请考虑以下示例:

#define FOO(x) x
// FOO( destringify("string x;"))   // no way
auto f = "string x;";
FOO(string x;)                      // hm whats the problem?

对我来说,很明显应该可以删除引号。我的意思是string x;无非是没有引号的"string x;"。问题是:这是不可能的。我不认为这有技术原因,人们只能推测为什么没有方法可以做到这一点。

然而,我设法说服自己记住,基本上预处理器所做的只是文本替换,因此,当在预处理器的级别上,你为什么要"去文本化"某些东西,无论如何一切都只是文本。反其道而行之。当我将上面的例子更改为这个时:

#define FOO(x) x
#define STR(x) STRSTR(x)
#define STRSTR(x) #x
#define STR_X string x;
auto f = STR(STR_X)
FOO(STR_X)

那么就没有必要去串化了。如果你发现自己想要通过编译未知的宏来取消字符串化字符串,那么你无论如何;)都走错了路。

相关文章: