ARM交叉编译调用math库sqrt函数在自定义函数中返回结果异常问题
问题原因分析
- 核心问题是代码未包含
<math.h>头文件,编译器无法获取sqrt函数的正确签名。按照C语言的隐式函数声明规则,编译器会默认假定未声明的sqrt返回值为int,也不会自动将传入的参数转换为sqrt需要的double类型。 - 自定义函数
fkt中传入的是int类型变量,编译器无法在编译期完成计算,必须在运行时调用数学库的sqrt函数:此时int类型的25会被直接当作double类型的参数传入,参数解析完全错误,最终返回结果不符合预期。 - 直接在
main中调用sqrt(25)运行正常的原因是,25是编译期常量,编译器会直接在编译阶段完成sqrt(25)的计算,替换为常量5,运行时不需要实际调用sqrt库函数,隐式声明的问题没有被触发。
解决方法
- 在代码开头引入数学库头文件:
#include <math.h>,让编译器获得sqrt的正确声明,会自动将传入的int参数转换为double类型,返回值也会正确从double转换为int,运行结果即可恢复正常。 - 建议编译时添加
-Wall -Wimplicit-function-declaration编译选项,会主动输出隐式函数声明的警告,提前发现这类问题。
内容的提问来源于stack exchange,提问作者Vojo
相关产品推荐
相关产品推荐

