这似乎只是一个小问题,我只需包含<cmath>
wherestd::floor
的使用方法即可解决,但这仍然很奇怪,我想知道是否有人知道发生了什么。我有一个项目,我可以在 MSVC、GCC 和 Clang 上使用 C++20 和 C++23 进行编译,没有问题。在 Android Studio 中,我可以使用 C++20 进行编译,但如果我在 CMake 配置中设置 C++20 标准,则会收到以下错误:
错误:命名空间“std”中没有名为“floor”的成员
我在需要的地方添加了<math.h>
,这在其他所有构建配置中都运行良好。我认为数学包含<cmath>
。无论如何,我也可以通过在需要的地方也添加 来消除错误<cmath>
,但是为什么在使用 C++23 编译的 Android 中会发生这种情况?例如,我已经有:
#include <math.h>
使用 Android Studio 中的 C++23 我必须包含:
#include <cmath>
为了能够std::floor
被识别。函数被注释掉了。看起来很奇怪。
<cmath>
在 中声明事物namespace std
。<math.h>
在全局命名空间中声明事物。(所有其他 C 标准库头文件也一样。)Cppreference(和标准)表示
<cmath>
允许在全局命名空间中另外声明事物,并且<math.h>
允许在std
命名空间中另外声明事物。std::floor在 中定义
cmath
。Andoid NDK使用
libc++
,而其他人可能使用 MSVC 或libstdc++
。标准不限制哪些标题将被传递包含,这取决于您的标准库供应商,标准只定义您应该包含什么以保证具有特定的功能。并且如果std::floor
它存在于cmath
。math.h是 C 标准库头文件。cmath是 C++ 标准库头文件。它们定义的函数具有相同的要求,但 C++ 函数位于 中
namespace std
。C 没有命名命名空间。供应商通常会以某种方式对此进行重复数据删除,通常是通过让一个标题包含另一个标题。
C++ 标准明确允许(但不要求)math.h 在中定义符号
namespace std
,以及允许cmath 在全局命名空间中定义符号。