17

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

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

现在调用这个宏""将从它的参数中删除

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

这将与宏字符串化相反:

#define STRINGIFY(x) #x

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

4

2 回答 2

13

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

于 2012-04-18T13:44:11.643 回答
2

我已经多次提出这个问题,但我仍然无法进入我的脑海。考虑这个例子:

#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)

那么就不需要去字符串化了。而且,如果您发现自己处于想要通过在编译时之前未知的宏来对字符串进行反字符串化的情况,那么无论如何您都走错了路;)。

于 2018-06-02T12:18:06.570 回答