我正在努力编译一些开源库,然后我遇到了这个:
GLfloat campos[3] = {0.0 + modelview[2], 0.0 + modelview[6], 0.0 + modelview[10]};
使用gcc在CentOS上编译很好,我真的期望它。
但是,在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,如下所示:
GLfloat modelview[16];
由于modelview是一个GLFloat,static_cast正在应用于带GLfloat的float总和的结果,但我确实希望免费得到它。
为什么行为不同?
答案 0 :(得分:5)
0.0
是double
类型的文字,而不是float
(参考文献http://en.cppreference.com/w/cpp/language/floating_literal)。
GLfloat
通常定义为float
。
因此,0.0 + x
(其中x
类型为GLfloat
)的结果属于double
类型。
将double
分配给float
是一种(可能)缩小的转换,这可能是编译器所抱怨的。
您可以使用0.0f
(类型为float
)。
答案 1 :(得分:0)
看起来原始代码使用的是C ++ 11功能。 GCC和Clang对C ++ 11的支持在版本之间有很大差异。因此,您使用的Clang版本完全有可能不支持该功能。