一、问题重现

当我在编写算法时,一个函数float Get_ACC_mg(uint8_t add),会将加速度换算成mg,返回浮点数,结果发现无论传入什么值,返回的都是24.000,很奇怪,我试着返回固定的一个浮点数也不行,更换成double也是一样的情况。

二、问题解决方式

最后发现,只要在对应的h文件里声明该函数,然后包含该h文件。

三、问题原因

当你没有包含头文件的时候,或者没有对函数进行声明的时候,编译器是怎么做的呢?

  1. 猜谜:编译器看到你在调用一个它不认识(没有声明)的函数时(发生在跨文件调用),会自己"猜"这个函数的样子

  2. 默认猜int:编译器最常用的猜测是"这可能是个返回int类型的函数"

  3. 错误处理:于是编译器按照int类型来准备接收返回值

之后生成二进制可执行文件时,链接器会寻找到匹配的函数定义,进行链接,但是之前的目标文件已经按照int型进行参数推断了,所以数据会按照int型进行存储和传递。

这就会导致浮点数返回时出错。

所以一定要养成提供给外部调用的函数要在h文件里进行声明,使用的地方要包含该h文件的习惯。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐