gpt4 book ai didi

c++ - `cosf`、`sinf`等不在`std`

转载 作者:IT老高 更新时间:2023-10-28 23:00:51 25 4
gpt4 key购买 nike

根据这里的讨论,我有 reported a bug给 Ubuntu 开发者。


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

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

int main()
{
printf("%f\n", std::cosf(0.0f));
}

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

包括 math.h 并使用非命名空间版本可以正常工作。怎么回事?

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

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

构建

最佳答案

该版本的库 (libstdc++8) 不完全符合 C++17。版权声明说它最后一次更新是在 2016 年。截至 2019 年 6 月,the latest upstream release被窃听。它确实有 #if __cplusplus > 201402L部分,但它没有声明 C++17 所需的标识符。 There is an open bug report.

/usr/include/c++/8/cmath在 Ubuntu 上,它包括 <math.h> , 为其函数取消定义一系列宏(C 标准库需要)以访问它们的名称,导入 cos , acos等进入std::命名空间,然后声明重载的floatlong double重载为 inline .

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

libc++ library 确实声明了它们,因此使用 clang++ -std=c++17 -stdlib=libc++ 进行编译应该可以。

关于c++ - `cosf`、`sinf`等不在`std`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56417980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com