0

我正在处理一些最初在 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 的宏语法是否意味着这种东西需要以不同的方式编写?

4

4 回答 4

3

在 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"其视为一个令牌而不是两个。

于 2012-09-17T13:16:59.487 回答
2

只需使用(#x "Map"). #x##"Map"它应该在 C++ 中工作。例如,这是完全有效的:("B" "Map")并且计算结果为"BMap"

于 2012-09-17T13:17:00.510 回答
1

请注意,实际上与解析时"Height""Map"相同。"HeightMap"所以你可以简单地使用这个:

#define DO_MAPPING(x,y,z)\
    myMaps[map##x] = GetTex( #x "Map" );\
    myRemaps[map##x] = GetHandle( #x "Remap" );
于 2012-09-17T13:16:04.383 回答
1

试试这个:

#define DO_MAPPING(x,y,z)\
    myMaps[map##x] = GetTex( #x "Map" );\
    myRemaps[map##x] = GetHandle( #x "Remap" );

编译器会自动连接两个字符串。

于 2012-09-17T13:16:14.927 回答