You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android平台C++23环境中引入<math.h>为何找不到std::floor?

Android平台C++23环境中引入<math.h>为何找不到std::floor?

嘿,这种跨平台编译的小破坑真的让人头大!我先帮你把遇到的情况理得明明白白:

  • 你的项目在MSVC、GCC、Clang这些桌面/通用编译器下,不管是C20还是C23标准都能顺顺利利编译,完全没毛病
  • 但到了Android Studio里,用C20标准编译一切正常,一旦切换到C23标准,立马就炸出这个错误:

error: no member named 'floor' in namespace 'std'

你说只要在用到std::floor的地方加个<cmath>头文件就能搞定,但还是摸不着头脑为啥会出现这种情况对吧?其实这大概率是Android NDK里C++23标准库的头文件适配问题:

  • 先搞清楚两个头文件的区别:<math.h>是C语言的老对头文件,里面的函数全在全局命名空间里;而<cmath>是C++专属的头文件,会把这些数学函数乖乖放到std命名空间下
  • C23对标准库的规范更严格了,Android NDK用的libc在实现C23的时候,可能完全遵循了新规范,没有把<math.h>里的函数自动导入到std命名空间(但C20版本还留了兼容的口子)
  • 像GCC、Clang桌面版这些编译器,可能在C23里还偷偷保留了一些兼容逻辑,所以哪怕你用<math.h>也能找到std::floor,但Android平台的libc更“死心眼”地遵守了新规则

所以你发现的临时解决办法其实就是正解:在用到std::floor的地方统一包含<cmath>而不是<math.h>,这样就能确保std命名空间下有这个函数的声明。要是项目里好多地方都用了<math.h>,也可以在公共头文件里加一句#include <cmath>,一次性解决所有地方的问题。

备注:内容来源于stack exchange,提问作者Zebrafish

火山引擎 最新活动