当使用 C 预处理器时,可以像这样对宏参数进行字符串化:
#define TO_STRING(x) "a string with " #x
所以使用时,结果如下:
TO_STRING(test)
将扩展为:"a string with test"
有什么相反的方法吗?获取字符串文字作为输入参数并生成 C 标识符?例如:
TO_IDENTIFIER("some_identifier")
将扩展为:some_identifier
谢谢您的回答。
编辑:对于那些想知道我需要它做什么的人:
我想通过字符串标识符来引用我的 3D 引擎的场景图中的节点,但同时避免在紧密循环中比较字符串。所以我想我会写一个简单的工具,它将在编译的预构建步骤中运行并搜索预定义的字符串——例如ID("something")
. 然后对于每个这样的标记,它会计算括号之间的字符串的 CRC32 并生成一个带有包含这些数字标识符的#defines 的头文件。例如对于字符串"something"
,它将是:
#define __CRC32ID_something 0x09DA31FB
然后,每个 cpp 文件将使用ID(x)
宏包含生成的头文件。ID("something")
当然会扩展为,因此__CRC32ID_something
实际上编译器会看到简单的整数标识符而不是人类友好的字符串。当然现在我会简单地接受,ID(something)
但我认为使用引号会更有意义 - 不知道ID
宏如何工作的程序员可以认为something
没有引号是 C 标识符,而实际上这样的标识符不存在全部。