C++ gcc` floorf`不是`std`的成员?

Chr*_*pka 10 c++ gcc c++11

我有以下代码:

#include <cmath>

float foo(float x, unsigned int m, float q = 0.0f)
{
    return std::floorf(x * float(m) + q);
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试用g ++ 5.4.0和选项编译它时,-std=c++11我得到一个错误说‘floorf’ is not a member of ‘std’.

现在我的理解是,C++ 11标准的第26.8节要求标准C++库头<cmath>声明与标准C库头相同的一组函数<math.h>,尽管在命名空间中std; 第1.2条规定"C"应解释为C99; 并且C99标准的第7.12.9.2节要求标准C库头<math.h>声明一个函数float floorf(float).

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

是什么赋予了?我在这里错过了什么吗?

(我知道C++ 11也定义了一个float std::floor(float);但是,我最近发现f浮点函数的-suffixed变体通常稍快一点,所以我更喜欢专门调用floorf().)

thb*_*thb 8

我相信你确实在标题中发现了一个错误.在我的GCC上,使用GNU C库(glibc),我可以通过退出std::全局命名空间来改变

    return std::floorf(x * float(m) + q);
Run Code Online (Sandbox Code Playgroud)

    return ::floorf(x * float(m) + q);
Run Code Online (Sandbox Code Playgroud)

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

如果您愿意,可以通过更改#include <cmath>#include <math.h>和(据我所知)将所有C-math-library调用放入全局命名空间来使解决方法变得可移植.不过,这仍然只是一种解决方法.

您可以继续将此报告为错误:https://gcc.gnu.org/bugzilla/.此外,为了让GCC团队更加认真地对待,您可以将错误报告链接到此处,以显示几个有能力的眼睛已经看过这个问题.同时,干得好.

  • @thb _"在GCC的libc6中"_ - 没有这样的事情.我假设你的意思是GNU C库,但是更正确地称为"glibc"而不是"libc6"并且不是GCC的一部分.GCC不提供C库,它使用系统现有的C库. (2认同)