在宏定义 (Clang) 中连接两个字符串
Concatenating two strings in macro definition (Clang)
我正在处理一些最初用MSVC编写的代码,我正在尝试让它在Clang上编译(使用Xcode)。我得到的代码是这样的:
#define DO_MAPPING(x,y,z)
myMaps[map##x] = GetTex( #x##"Map" );
myRemaps[map##x] = GetHandle( #x##"Remap" );
目前我收到一个构建错误,说粘贴形成了字符串"Height""Map"
,我真的很想"HeightMap"
.这段代码适用于 MSVC,Clang 的宏语法是否意味着这种东西需要以不同的方式编写?
在 C 中,"X""Y"
等价于 "XY"
。但是,当您在宏中编写这样的东西时:
str1##str2
您告诉词法分析器将两者连接为一个令牌。 "X""Y"
实际上是由词法分析器1 连接的两个标记,而"X"##"Y"
应该是一个标记(这不是有效的标记)。
您需要的是简单地删除##
:
#define DO_MAPPING(x,y,z)
myMaps[map##x] = GetTex( #x "Map" );
myRemaps[map##x] = GetHandle( #x "Remap" );
1 或语义分析器,取决于实现
通常,与字符串匹配的正则表达式如下所示(简化):
"(a|b)*"
(假设a
是不需要转义的所有字符的列表,b
是其他字符)。对于 MSVC,它的定义可能如下:
"(a|b)*"s*+
(s
为空格)
这意味着 MSVC 可能将"X" "Y"
视为一个令牌而不是两个令牌。
只需使用 (#x "Map")
代替 #x##"Map"
即可。它应该在C++工作。例如,这是完全有效的:("B" "Map")
并评估为"BMap"
。
请注意,"Height""Map"
在解析时实际上与"HeightMap"
相同。所以你可以简单地使用它:
#define DO_MAPPING(x,y,z)
myMaps[map##x] = GetTex( #x "Map" );
myRemaps[map##x] = GetHandle( #x "Remap" );
试试这个:
#define DO_MAPPING(x,y,z)
myMaps[map##x] = GetTex( #x "Map" );
myRemaps[map##x] = GetHandle( #x "Remap" );
编译器会自动连接两个字符串 Illion。
相关文章:
- 两个字符串在 c++ 中不相等
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 比较两个字符串后卡在无限循环中
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 我需要帮助在一个类中输入两个字符串并获取其输出
- 这两个C++语句连接字符串有什么区别?
- 两个字符串之间的数学运算
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- 有没有办法我可以在 C++ 中使用 if 语句来说明如果一个字符串不是两个名称的 eqal,它会给出一个输出,ATM i
- 如何在 main 函数中输出两个新字符串C++?
- sscanf() 有两个字符串参数
- 我的字符串数组一次打印出前两个字符串
- 两个 c++ 字符串上的异或
- 函数返回两个字符串的第一个常用字符
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)