c++ - `cosf`、`sinf` 等不在`std` 中
问题描述
解决方案
该版本的库 ( libstdc++8 ) 不完全符合 C++17。版权声明说它最后一次更新是在 2016 年。截至 2019 年 6 月,最新的上游版本存在漏洞。它确实有一个#if __cplusplus > 201402L
部分,但它没有声明 C++17 所需的标识符。 有一个打开的错误报告。
在/usr/include/c++/8/cmath
Ubuntu 上看,它包含<math.h>
、取消定义了一系列宏来为其函数(C 标准库需要)访问它们的名称、导入cos
、acos
等到std::
命名空间,然后将重载float
和long 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++
应该可以工作。
推荐阅读
- python - 为什么 deleteB() 不删除链表中的最后一个元素?
- android-studio - Android Studio 3.5 的 Instant Run 在哪里?
- amazon-web-services - 如何将参数存储键添加为子列表
- sql - 当Case语句涉及日期列时如何处理聚合函数
- javascript - 递归 IIFE 中的 bind(this) - 它到底在做什么?
- java - Idea无法导入maven项目
- php - 会话中的 PHP 变量没有立即更新
- c - 您能否从与等待的互斥锁不同的互斥锁中发出条件变量的信号?
- android - 使用颤振的设备的定期位置报告
- express - 如何在 Sequelize 中插入数据