在Clang中使用MSVC预处理器'charizing'运算符

时间:2012-09-21 11:41:30

标签: c++ visual-c++ clang c-preprocessor

我有以下代码,有人在MSVC上工作给我:

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

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

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

对'int'的显式转换是否有效或是chalicing运算符做了哪些不同的事情?

2 个答案:

答案 0 :(得分:5)

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

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

static_castconst char(&)[2]可确保在未获得长度为1的字符串时出现编译时错误,如果计算尾随'\0',则为两个字符。无论字符串的长度如何,普通#y[0]都会默默地接受第一个字符。

答案 1 :(得分:1)

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

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