3

我得到了从事 MSVC 工作的人给我的以下代码:

#define MAP1(x, y) map[#x] = #@y;

我在 Xcode 上,使用 Clang,从各种谷歌搜索中我发现这被称为“charizing operator”,并且特定于 MSVC 的预处理器。有没有办法在使用 Clang 时模拟此运算符的功能?我尝试删除@但收到以下错误消息:

Assigning to 'int' from incompatible type 'const char[2]'

显式转换为“int”会起作用还是字符化操作符做不同的事情?

4

2 回答 2

6

字符串化运算符(标准 C++)转换a"a",因此字符化运算符听起来像是变成a'a'. 在简单的情况下,您可以'a'通过"a"获取第一个字符来获取。

#define MAP1(x, y) map[#x] = static_cast<const char(&)[2]>(#y)[0];

如果你没有得到长度为 1 的字符串, to 确保你得到一个编译时错误,如果你计算尾随 1 是两个static_cast字符。无论字符串的长度如何,plain都会默默地取第一个字符。const char(&)[2]'\0'#y[0]

于 2012-09-21T11:47:55.107 回答
1

你尝试过类似#y[0]的东西吗?基本上,“字符串化 y 并获取第一个字符”:-)

除此之外,因为从外观上看,生成的语句无论如何都是在运行时执行的,所以您可以将 y 字符串化,将其传递给函数并让该函数返回正确的内容。

于 2012-09-21T11:48:14.747 回答