与C预处理器相反;“严格化”;

与C预处理器相反;“严格化”;,c,macros,c-preprocessor,stringification,C,Macros,C Preprocessor,Stringification,使用C预处理器时,可以像这样字符串化宏参数: #define TO_STRING(x) "a string with " #x 因此,使用时,结果如下: TO_STRING(test)将扩展为:“带测试的字符串” 有没有相反的方法?获取字符串文字作为输入参数并生成C标识符?例如: TO_IDENTIFIER(“some_IDENTIFIER”)将扩展到:some_IDENTIFIER 谢谢你的回答 编辑:对于那些想知道我需要它做什么的人: 我想通过字符串标识符引用3D引擎场景图中的节点,但同时

使用C预处理器时,可以像这样字符串化宏参数:

#define TO_STRING(x) "a string with " #x
因此,使用时,结果如下:

TO_STRING(test)
将扩展为:
“带测试的字符串”

有没有相反的方法?获取字符串文字作为输入参数并生成C标识符?例如:

TO_IDENTIFIER(“some_IDENTIFIER”)
将扩展到:
some_IDENTIFIER

谢谢你的回答

编辑:对于那些想知道我需要它做什么的人:

我想通过字符串标识符引用3D引擎场景图中的节点,但同时避免在紧循环中比较字符串。所以我想我将编写一个简单的工具,在编译和搜索预定义字符串的预构建步骤中运行,例如
ID(“某物”)
。然后,对于每个这样的标记,它将计算括号之间字符串的CRC32,并生成一个头文件,其中包含这些数字标识符的#defines。例如,对于字符串
“something”
,它应该是:

#定义uu CRC32ID_u某物0x09DA31FB


然后,生成的头文件将使用
ID(x)
宏包含在每个cpp文件中。
ID(“something”)
当然会扩展到
\uucrc32id\usomething
,因此实际上编译器将看到的是简单的整数标识符,而不是友好的字符串。当然,现在我只需要满足于
ID(某物)
,但我认为使用引号会更有意义-一个不知道
ID
宏如何工作的程序员可以认为
没有引号的
某物是一个C标识符,而实际上这种标识符根本不存在。

不,你不能对某些东西进行解构。

出于好奇,这有什么用?你不是在为一个非常奇怪的用例做什么,就是在做完全错误的事情。请描述真正的问题。你需要一个C翻译来完成:)对于那些想知道的人,添加了一些解释。:)我在谷歌上搜索了很多次,想找到一个解决方案,不幸的是,目前还没有解决方案,这个选项(destringify)对于编写因式分解的c代码非常有用。更一般地说,预处理器可以将令牌连接在一起,但不能将令牌分开。@FDinoff:最好不要。只有准备好“数据库”后,这可能会起作用由
enum_from_string()
处的常量字符串组成,否则不是:/,而是有趣的:)
//unstringify test

enum fruits{apple,pear};

#define IF_WS_COMPARE_SET_ENUM(x) if(ws.compare(L#x)==0)f_ret=x;

fruits enum_from_string(wstring ws)
{
 fruits f_ret;
 IF_WS_COMPARE_SET_ENUM(apple)
 IF_WS_COMPARE_SET_ENUM(pear)
 return f_ret;
}

void main()
{
 fruits f;
 f=enum_from_string(L"apple");
 f=enum_from_string(L"pear");
}