我有以下代码,有人在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运算符做了哪些不同的事情?
答案 0 :(得分:5)
字符串化运算符(标准C ++)将a
转换为"a"
,因此charizing运算符听起来像将a
转换为'a'
。在简单的情况下,您可以通过获取第一个字符从'a'
获取"a"
。
#define MAP1(x, y) map[#x] = static_cast<const char(&)[2]>(#y)[0];
static_cast
到const char(&)[2]
可确保在未获得长度为1的字符串时出现编译时错误,如果计算尾随'\0'
,则为两个字符。无论字符串的长度如何,普通#y[0]
都会默默地接受第一个字符。
答案 1 :(得分:1)
除此之外,因为从它的外观来看,无论如何生成的语句都是在运行时执行的,你可以将y字符串化,传递给函数并让该函数返回正确的东西。