C++ `cosf`、`sinf`等不在'std'中`

C++ `cosf`、`sinf`等不在'std'中`,c++,gcc,libstdc++,C++,Gcc,Libstdc++,根据这里的讨论,我必须向Ubuntu开发者解释。 201402L部分,但它没有声明C++17所需的标识符 查看Ubuntu上的/usr/include/c++/8/cmath,它包括,为其函数(c标准库要求)取消定义一系列宏以访问它们的名称,将cos,acos等导入std:命名空间,然后将重载的float和long double重载声明为inline < >在代码> STD::/Calp>命名空间中,它从不声明 COSF ,即使说“C中定义为C的函数的名称应定义为C++标准库中的函数”,并且“

根据这里的讨论,我必须向Ubuntu开发者解释。


<编译以下示例C++程序:

#包括
#包括
int main()
{
printf(“%f\n”,std::cosf(0.0f));
}
我收到以下错误消息:
error:'cosf'不是'std'的成员。

包括
math.h
和使用非命名空间版本都可以。发生了什么事

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


我正在使用
g++--std=c++17测试构建。cpp

库()的版本不完全符合c++17。版权声明说,它最后一次更新是在2016年。截至2019年6月,已安装窃听器。它确实有一个
#if u cplusplus>201402L
部分,但它没有声明C++17所需的标识符

查看Ubuntu上的
/usr/include/c++/8/cmath
,它包括
,为其函数(c标准库要求)取消定义一系列宏以访问它们的名称,将
cos
acos
等导入
std:
命名空间,然后将重载的
float
long double
重载声明为
inline

< >在代码> STD::/Calp>命名空间中,它从不声明<代码> COSF ,即使说“C中定义为C的函数的名称应定义为C++标准库中的函数”,并且“使用外部链接声明的标准C库中的每个名称都保留给实现,以便在
命名空间std
和全局命名空间中用作带有
外部“C”
链接的名称。”但是,它没有明确说明必须支持
std::expf
等,直到这显然是一个疏忽


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

你的编译命令是什么?只是一个简单的
g++main.cpp
?我想
std::sinf
std::cosf
等都是在c++11中添加的。你是用c++11编译的吗?g++--std=c++17 main.cppOn Godbolt,这个giv当使用g++或clang与libstdc++一起使用时,会出现错误。当使用clang-stdlib=libc++时,它会起作用。@Shawn C++17要求它在那里,因此该库落后于标准几年。如果它应该在那里,这只是一个bug。你能证明这一点吗?@HWalters请参阅C++17标准草案N4659,(最终免费提供的草案),第1140页。@BrennanVincent谢谢。添加了你的引文。@HWalters所以现在我自己也不确定。N3337工作草案没有这样的要求,但这是最后一刻的更改,还是网站出错了?在C++11(N3337)中,它说“这些标题的内容与标准C库标题
相同,但有以下更改:”。C版本确实包含
cosf
(在C99中添加,这是C++11中“标准C”的意思)和“以下更改”“不要说任何会排除cosf的话。我认为这只是一个疏忽,cosf没有列在表119中。