首页 > 解决方案 > `cosf`、`sinf` 等不在`std` 中

问题描述

标签: c++gcclibstdc++

解决方案


该版本的库 ( libstdc++8 ) 不完全符合 C++17。版权声明说它最后一次更新是在 2016 年。截至 2019 年 6 月,最新的上游版本存在漏洞。它确实有一个#if __cplusplus > 201402L部分,但它没有声明 C++17 所需的标识符。 有一个打开的错误报告。

/usr/include/c++/8/cmathUbuntu 上看,它包含<math.h>、取消定义了一系列宏来为其函数(C 标准库需要)访问它们的名称、导入cosacos等到std::命名空间,然后将重载floatlong double重载声明为inline.

它从不在命名空间cosf内声明std::,即使C++17 说它应该。C++11 标准规定,“ 在C 中定义为函数的名称应在 C++ 标准库中定义为函数”,并且“标准 C 库中声明为外部链接的每个名称都保留给实现,以用作在全局命名空间中和全局命名空间中都有extern "C"链接namespace std的名称。” 但是,它没有明确说明std::expf等。必须支持到2016 年 6 月的 P0175r1。 这显然是一个疏忽。

libc++库确实声明了它们,因此编译clang++ -std=c++17 -stdlib=libc++应该可以工作。


推荐阅读