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

Using MSVC preprocessor 'charizing' operator in Clang

本文关键字:charizing 运算符 处理器 预处理 Clang MSVC      更新时间:2023-10-16

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

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

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

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

显式转换为"int"是否有效,或者魅力运算符是否在做不同的事情?

字符串

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

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

const char(&)[2] static_cast可确保在没有获得长度为 1 的字符串时出现编译时错误,如果计算尾随'',则为两个字符。普通#y[0]会静默地采用第一个字符,而不管字符串的长度如何。

你试过 #y[0]吗?基本上,"字符串化 y 并取第一个字符":-)

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