Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么gcc和llvm的行为不同?_C++_Xcode_Opengl_Gcc_Llvm - Fatal编程技术网

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];