为什么gcc和llvm之间的行为有所不同?

时间:2013-09-05 13:08:59

标签: c++ xcode opengl gcc llvm

我正在努力编译一些开源库,然后我遇到了这个:

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总和的结果,但我确实希望免费得到它。

为什么行为不同?

2 个答案:

答案 0 :(得分:5)

0.0double类型的文字,而不是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版本完全有可能不支持该功能。