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

C++ 有没有办法删除C宏中的引号?,c++,c,macros,stringify,C++,C,Macros,Stringify,假设我想取消宏参数的字符串化,它应该将的“text”转换为的text #define UN_STRINGIFY(x) /* some macro magic here */ 现在调用此宏将从其参数中删除“” UN_STRINGIFY("text") // results in ----> text 这与宏观严格化相反: #define STRINGIFY(x) #x 这是可能的,还是我在玩宏邪恶?这是不可能的。这可能是一件好事:如果你传递一个字符串,你会认为你可以把几乎所有的东西都放

假设我想取消宏参数的字符串化,它应该将
的“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?
对我来说,似乎很明显,应该可以删除引号。我的意思是
字符串x
就是不带引号的
字符串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)

那么就没有必要去严格化。如果您发现自己需要通过编译时之前不知道的宏对字符串进行反序列化,那么无论如何,您的方法都是错误的

如果可能的话,你想做什么?那是不可能的;出于好奇,它的预期用途是什么?嗯,通常我只会使用stringify,但我正在重构一些宏,并不想改变调用模式<代码>#定义此_宏(sringParam)常量char*var=stringParam将更改为
#定义此_宏(stringParam)常量char*un##stringParam=stringParam。我只需要使用正则表达式搜索和替换来在源代码级别修复它们,然后就可以使用它了……另一种可能的用法是传入“字符串”,用于构造标识符,其中一些可能具有现有的CPP宏定义。因为您只想使用这些“字符串”来构建实际的标识符名称,所以不希望现有的CPP宏对其进行操作#ifdef/#unde/push_宏是实现这一点的一种方法,但它在可读性方面非常嘈杂。tbh我不相信这种说法:“取消字符串化会突然导致编译器真正关心该字符串的内容”。如果你有
#定义FOO(x)x
,那么
x
几乎可以是任何东西,当然编译器关心
x
是什么。考虑<代码> AutoF=“一些字符串”;FOO(一些字符串)
,这里的
x
只是一个没有引号的字符串。好吧,编译器甚至不知道它要处理的代码是否是宏扩展的结果。“这里x只是一个没有引号的字符串。”-不,
x
是一系列预处理器标记。