44

当使用 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 标识符,而实际上这样的标识符不存在全部。

4

2 回答 2

28

不,你不能取消字符串化的东西。

于 2011-08-08T12:35:03.613 回答
1
//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");
}
于 2013-05-24T03:16:48.133 回答