我正在处理最初由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的宏语法是否存在某种含义,意味着这种事情需要用不同的方式编写?

#1楼 票数: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"视为一个令牌而不是两个令牌。

#2楼 票数:2

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

#3楼 票数:1

请注意, "Height""Map" "HeightMap"在解析时实际上与"HeightMap"相同。 因此,您可以简单地使用以下代码:

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

#4楼 票数:1

尝试以下方法:

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

编译器会自动将两个字符串文字串联起来。

  ask by benwad translate from so

未解决问题?本站智能推荐:

1回复

使用MSVC代码的Clang中的“使用不同类型重新定义Typedef”错误

我已经获得了一些可以在MSVC上很好地编译的代码,并且我正在尝试使其在Xcode的Clang上进行编译。 我目前遇到的问题是使用以下typedef重新定义类: 查看预处理后的输出,可以看到在此typedef之前有两个class Entity前向声明。 但是, class Entity
1回复

Clang 3.1和用户定义的文字

Clang 3.1声称支持用户定义的文字。 我可以定义这个: 但是当我尝试使用它时,我收到一个错误: 整数常量上的后缀'_tryit'无效
1回复

在GCC 4.7 / Clang 3.2中宏替换失败

我已经在Windows 7 + VisualStudio 2012环境中成功使用了一些“流行”宏。 上周,我想将该项目移植到Linux(无依赖于平台的代码,较小的代码库)。 制作C ++代码很容易,但是宏的用法却不尽相同。 我整理了这个简单的测试: 最后,宏替换在VS 2012
1回复

gcc标志强制使用预定义的宏

我的问题是如下。 我正在尝试为mips建立一个项目。 当我从它的存储库下载它时,构建它没有问题,但当我构建它时它是一个更大的项目的一部分,我收到一个下面的错误: 错误:在数字常量之前预期','或'...' 我发现这是一个问题,因为一些变量被称为mips,而相同的变量被定义为
1回复

将8个参数传递给variadic宏在GCC中失败,但仅在C ++中失败?

在下面的代码中, CHOOSE_MACRO应该根据参数的数量在传递给它的两个宏之间进行选择: FOO()应该扩展到RESULT0 ,而FOO(x)应该扩展到RESULT1 。 这适用于Clang for C( http://rextester.com/LRX65441 )和C ++( ht
1回复

为什么string concat宏不能用于这个“+”情况?

简短的问题: 是否允许为字符串连接宏##连接特殊符号,如+ , - 例如, 将OP(+)扩展为operator+ ? 确切的问题: 对于strOpMap2 ,使用clang++ -c -std=c++11 ,它会报告: 使用g++ -c -std=c++11
1回复

变量宏没有参数

我正在使用一些日志记录宏,它们打印出__PRETTY_FUNCTION__宏提供的信息,如果需要,最多可以打印两个参数的名称和值。 我的代码的简化版本看起来像 我可以使用这些宏 当我用clang编译这段代码时,我得到一个很好的输出,包含类和函数信息以及变量的名称和值。 但我也
1回复

编译器之间的宏扩展顺序混淆

这段代码在Visual Studio 2015中编译,但不在Clang中编译: 看来Clang在将COMMA宏提交给MC()宏之前扩展它。 根据C ++标准,“谁是对的”? 另外,我如何让Clang表现得像Visual Studio? 编辑:简化了示例,并更改了一些宏名称。