C++ 为什么gcc和llvm的行为不同?
我正在努力编译一些开源库,然后我遇到了以下问题:C++ 为什么gcc和llvm的行为不同?,c++,xcode,opengl,gcc,llvm,C++,Xcode,Opengl,Gcc,Llvm,我正在努力编译一些开源库,然后我遇到了以下问题: GLfloat campos[3] = {0.0 + modelview[2], 0.0 + modelview[6], 0.0 + modelview[10]}; 这在CentOS上使用gcc编译得很好,我真的很期待它 但是,在Mac上,将XCode与llvm一起使用,它将无法编译,我不得不将其更改为: GLfloat campos[3] = static_cast<GLfloat>(0.0 + modelview[2]), st
GLfloat campos[3] = {0.0 + modelview[2], 0.0 + modelview[6], 0.0 + modelview[10]};
这在CentOS上使用gcc编译得很好,我真的很期待它
但是,在Mac上,将XCode与llvm一起使用,它将无法编译,我不得不将其更改为:
GLfloat campos[3] = static_cast<GLfloat>(0.0 + modelview[2]), static_cast<GLfloat>(0.0 + modelview[6]), static_cast<GLfloat>(0.0 + modelview[10]);
由于modelview是一个GLFloat,静态_cast被应用到带有GLFloat的float和的结果中,但我确实希望免费获得这个结果
为什么行为不同?看起来原始代码使用的是C++11功能。GCC和Clang对C++11的支持在不同版本之间有很大差异。因此,您使用的Clang版本完全可能不支持该功能。
0.0
是类型为double
的文本,而不是float
(参考)。
GLfloat
通常定义为float
因此,0.0+x
(其中x
具有类型GLfloat
)的结果是类型double
将double
赋值给float
是一种(潜在的)变窄转换,这可能是编译器所抱怨的
您可以使用
0.0f
(类型为float
)。真的,这是什么功能?实际上,在这种情况下,gcc缺少对功能的支持,该功能是“缩小初始化列表中的转换现在是一个错误”。它是双精度与GLfloat
的总和,这就是问题所在0.0
是double
,0.0f
是float
。在代码中将0.0解释为double时,将“f”放在后面。通过链接:后缀类型说明符定义浮点文本的实际类型:(无后缀)定义double;f定义浮点;-我从来没有注意过这个。谢谢你指出这一点。@jehuty如果你用-wall编译代码,你会很快学会这些东西的。在GLSL支持f后缀之前的一段时间,当我使用f后缀在GLSL中编写浮点常量时(作为一种习惯),它会让我发疯,编译器会将它们作为解析错误抛出:),但一般来说,在大多数从C派生的语言中,应该使用f后缀来表示单精度浮点。
GLfloat modelview[16];