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

时间:2012-04-18 13:43:02

标签: c++ c macros stringify

假设我想取消串联应将"text"转换为text的宏参数。

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

现在调用此宏将从其参数

中删除""
UN_STRINGIFY("text") // results in ----> text

这与宏字符串化相反:

#define STRINGIFY(x) #x

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

3 个答案:

答案 0 :(得分:14)

这是不可能的。这可能是一件好事:如果你传递一个字符串,你会认为你可以把所有东西都放进去。对它进行非字符串化会突然导致编译器实际关注该字符串的内容。

答案 1 :(得分:0)

我已经好几次来到这个问题但仍然无法理解。考虑这个例子:

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

然后没有必要去字符串化。如果你发现自己想要通过一个在编译时之前未知的宏来解串字符串,那么无论如何你都在错误的轨道上;)。

答案 2 :(得分:0)

我对此情况有实际用途。否则,我可能没有搜索过。 想象一下,您最初将数据结构声明为字符串。但是要使用该字符串实例化该类型的对象。怎么能做到呢?答案是解串。 在运行时,如果您想显示有关数据结构的帮助,没有更好的方法...