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

Bre*_*ent 14 c++ gcc libstdc++

根据此处的讨论,我已向Ubuntu开发人员报告了一个错误


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

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

int main()
{
    printf("%f\n", std::cosf(0.0f));
}
Run Code Online (Sandbox Code Playgroud)

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

包含math.h和使用非命名空间版本可以正常工作。到底是怎么回事?

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

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

Dav*_*lor 10

该版本的库(libstdc ++ 8)不完全符合C ++ 17。版权声明说,它的最新更新时间为2016年。截至2019年6月,最新的上游版本已被窃听。它确实有一个#if __cplusplus > 201402L部分,但没有声明C ++ 17所需的标识符。 有一个开放的错误报告。

看着/usr/include/c++/8/cmath在Ubuntu上,它包括<math.h>,取消定义了一系列宏及其功能(C标准库所需)来访问他们的名字,进口cosacos等进入std::命名空间,然后声明重载floatlong double过载的inline

即使C ++ 17声明必须cosfstd::命名空间中也不会声明它。C ++ 11标准说,“这是用C语言定义函数的名称应定义为C函数++标准库”,从标准C库,“每名具有外部链接被保留,以用作实施申报在全局名称空间extern "C"namespace std和在全局名称空间中都具有链接的名称。”但是,它没有明确声明std::expf等。必须得到支持,直到2016年6月P0175r1。 这显然是一个疏忽。

libc中++库不声明它们,有这么编译clang++ -std=c++17 -stdlib=libc++应该工作。

  • @HWalters,请参阅C ++ 17标准N4659草案(最终免费提供的草案),第1140页。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659。 pdf格式 (2认同)