为什么 gcc 和 llvm 之间的行为不同
Why is behavior different between gcc and llvm?
我正在努力编译一些开源库,然后我遇到了这个:
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.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
)。
看起来原始代码使用的是 C++11 功能。GCC 和 Clang 对 C++11 的支持在不同版本之间差异很大。因此,您正在使用的Clang版本完全可能不支持该功能。
相关文章:
- GCC 中 __attribute__((未使用)) 和 __attribute((未使用)) 之间的区别
- GCC 警告和 gcc 错误消息之间的区别
- 为什么库API+编译器ABI足以确保具有不同版本gcc的对象之间的兼容性
- 为什么 GCC 和 clang 之间编译的 c++17 lambda 存在差异?
- libstdc++的make_shared布局在gcc 4.x和gcc 6.x之间是否发生了变化?
- 在继承多个空类时,了解GCC/Clang vs MSVC2015之间的不同填充规则
- Visual C++ 和 gcc 之间从 std::isblank 返回不一致.哪一个错了
- Atom 和 i3/5 之间的通用 gcc C/C++ 标志?
- MSVC 和 GCC 之间的矢量行为不同
- 自动扣除类型与尺寸的类型在Visual Studio C 和GCC之间有所不同
- GLIBCXX(libstdc++.so.6)与gcc版本之间的关系
- Eclipse上的交叉GCC和MacOSX GCC之间的差异
- GCC和MSVC之间的文件输出不一致
- GCC和Clang之间的C 不一致
- binutils 和 gcc 之间有什么关系?
- 对于高度优化的矩阵多应用程序代码,MSVC和GCC之间的性能差异
- 可视化GDB在MSVC2012和GCC 7.3.1之间打印不同的C++输出
- GCC和clang(SFINAE)之间的过载解决行为差异
- Const引用Visual Studio和GCC之间的语法差异
- GCOV:使用GCC构建时,覆盖率和最新覆盖率之间的区别是什么