Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++ C++;gcc'floorf'不是'std'的成员?_C++_C++11_Gcc - Fatal编程技术网

C++ C++;gcc'floorf'不是'std'的成员?

C++ C++;gcc'floorf'不是'std'的成员?,c++,c++11,gcc,C++,C++11,Gcc,我有以下代码: #include <cmath> float foo(float x, unsigned int m, float q = 0.0f) { return std::floorf(x * float(m) + q); } #包括 浮点foo(浮点x,无符号整数m,浮点q=0.0f) { 返回标准::地板(x*float(m)+q); } 现在,当我尝试用g++5.4.0和选项-std=c++11编译这个时,我得到一个错误,说'floorf'不是'std'的

我有以下代码:

#include <cmath>

float foo(float x, unsigned int m, float q = 0.0f)
{
    return std::floorf(x * float(m) + q);
}
#包括
浮点foo(浮点x,无符号整数m,浮点q=0.0f)
{
返回标准::地板(x*float(m)+q);
}
现在,当我尝试用g++5.4.0和选项
-std=c++11
编译这个时,我得到一个错误,说
'floorf'不是'std'的成员

<> P> >现在我理解,C++ 11标准的第26.8条规定,标准C++库头<代码> <代码>声明与标准C库头<代码> <代码>相同的一组函数,尽管在命名空间<代码> STD<代码>中;第1.2条规定“C”应解释为C99;C99标准第7.12.9.2条要求标准C库头
声明一个函数
float floorf(float)

因此,通过这种推理,
应该声明一个函数
float std::floorf(float)
,就我所知,它应该与我的代码匹配

有什么好处?我是不是遗漏了什么


(我知道C++11还定义了一个
float std::floor(float)
;但是,我最近发现,float函数的
f
-后缀变体通常稍快一些,所以我更愿意专门调用
floorf()

,我相信您确实在头中发现了一个bug。在我的GCC上,使用gnuc库(glibc),我可以通过退出
std::
进入全局名称空间,改变

    return std::floorf(x * float(m) + q);

该解决方案之所以有效,是因为
floorf()
属于C标准库,因此它在glibc中有一个全局符号。由于该变通方法使用全局符号(C++11允许但不要求存在),因此该变通方法是不可移植的。然而,对于glibc来说,它似乎是有效的

如果您愿意,可以通过将
#include
更改为
#include
并(据我所知)将所有C-math-library调用删除到全局名称空间中,使该解决方案变得可移植。不过,这仍然只是一个解决办法


您可以继续并在以下位置报告此错误:。此外,为了让GCC团队更加认真地对待这个问题,您可以将bug报告链接到这里,以表明有几对称职的眼睛已经看到了这个问题。同时,做得很好。

这很奇怪,在使用clang++编译时,它似乎工作得很好,但事实上,在g++中,它甚至在最新版本上似乎也不工作。作为参考,我刚刚在C++11和C++14标准中提交了此文件,但在表“Header
synopsis”中没有列出
floorf
,它是在C++17中修复的。学究式的阅读标准可能会得出结论,
只需提供
:floorf
,而不必提供
std::floorf
相关链接。另外,“我最近发现,浮点函数的f后缀变体通常稍快一些”,这听起来很奇怪。关于速度差,你是用
-O0
测量的吗
std::pow
是一个调用
powf
的函数,而
powf
是直接调用
powf
,因此如果不内联,速度会慢一些,但我希望内联可以很容易地消除这种差异。“这不正确,但它可以工作。”--从某种意义上说,C++11确实允许存在这样一个全局符号。但它并不强制使用它,因此任何使用此全局符号的程序都是不可移植的。@ChristophLipka如果包含
,则它是可移植的。@thb“在GCC的libc6中”——没有这样的东西。我想你指的是GNUC库,但更正确的说法是“glibc”而不是“libc6”,它不是GCC的一部分。GCC不提供C库,它使用系统的现有C库。@ JoaNaNeWakyy技术上是C标题,C++中只包含与C库的兼容性。我想避免依赖它,因为它会让事情变得一团糟。幸运的是,在使用<代码>地板(浮点) SUBLUT.@时,一个可移植的真正的C++方法存在,从技术上讲,它是一个与相同名称的C标题相似(但不完全相同)的C++头。
    return ::floorf(x * float(m) + q);