在 Clang 中使用 MSVC 预处理器'charizing'运算符
Using MSVC preprocessor 'charizing' operator in Clang
我有以下代码,有人在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,将其传递给函数并让该函数返回正确的内容。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 在 Clang 中使用 MSVC 预处理器'charizing'运算符