C++ `cosf`、`sinf`等不在'std'中`
根据这里的讨论,我必须向Ubuntu开发者解释。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++标准库中的函数”,并且“
<编译以下示例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中。