基于此处的讨论,我向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
答案 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
进行编译应该可以。