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

Why is behavior different between gcc and llvm?

本文关键字:之间 gcc llvm 为什么      更新时间:2023-10-16

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

GLfloat campos[3] = {0.0 + modelview[2], 0.0 + modelview[6], 0.0 + modelview[10]};

这在 CentOS 上使用 gcc 编译得很好,我真的很期待它。

但是,在Mac上,使用带有llvm的XCode,它将无法编译,我不得不将其更改为:

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

为什么行为不同?

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)。

看起来原始代码使用的是 C++11 功能。GCC 和 Clang 对 C++11 的支持在不同版本之间差异很大。因此,您正在使用的Clang版本完全可能不支持该功能。