`cosf`,`sinf`等不在`std`中

时间:2019-06-02 18:49:52

标签: c++ gcc libstdc++

基于此处的讨论,我向reported a bug致了Ubuntu开发人员。


在编译以下示例c ++程序时:

#include <cmath>
#include <stdio.h>

int main()
{
    printf("%f\n", std::cosf(0.0f));
}

我收到以下错误消息:error: ‘cosf’ is not a member of ‘std’

包含math.h并使用非命名空间版本可以正常工作。发生了什么事?

我正在Ubuntu 19.04上使用g ++ 8.3.0-6ubuntu1。

我正在与g++ --std=c++17 test.cpp

合作

1 个答案:

答案 0 :(得分:10)

该版本的库(libstdc++8)不完全符合C ++ 17。版权声明说,它的最新更新时间为2016年。截至2019年6月,the latest upstream release已被窃听。它确实有一个#if __cplusplus > 201402L部分,但没有声明C ++ 17所需的标识符。 There is an open bug report.

在Ubuntu上查看/usr/include/c++/8/cmath,它包含<math.h>,未定义一系列用于其功能的宏(C标准库要求)以访问其名称,导入cos,{ {1}}等到acos命名空间中,然后将重载的std::float重载声明为long double

即使C++17 says it shall. C++11 standard说,“它永远不会在inline命名空间内声明cosf,“在C中定义为函数的名称应在C中定义为函数。 C ++标准库”和“使用外部链接声明的标准C库中的每个名称都保留给实现,以在std::和全局名称空间中用作具有extern "C"链接的名称。 ”,但并未明确声明namespace std等。必须得到支持,直到P0175r1 in June 2016.这显然是疏忽。

libc++库确实声明了它们,因此使用std::expf进行编译应该可以。