C的pow函数拒绝使用变量指数
假设我有以下代码段:
int i; double value; for(i = 0; i < CONSTANT; i++) { value = (double)pow(2, i); }
尝试编译此代码会产生“未定义的对’pow’的引用”错误。
包括或排除math.h
没有区别,因为它最终都被包括在内。
将2.0
提升为硬编码电源可以正常工作,但如果我用包含i
的表达式替换指数,一切都会失败。
我究竟做错了什么? 谢谢。
这是一个非常有趣的行为,也是一个很好的学习例子。
要解决您的问题,请添加
-lm
到你的gcc命令行(如果你正在使用gcc)。 这告诉编译器链接数学库。
似乎正在发生的事情是,如果你正在使用
pow(2.0, 3);
编译器意识到这个表达式的计算结果为常量,并且仅仅是替换。
因此,不必调用库函数。
您需要链接-lm以实际包含数学库。
它适用于硬编码值,因为编译器优化了pow调用。
您必须链接到数学库:
gcc program.c -lm
原因是GCC(和一些其他编译器)具有文字常量的内置pow()
函数。 因此,如果您手动调用带有2.0的pow()
,编译器将实际找出答案是什么,并替换为您。 使用变量输入,编译器必须依赖于必须链接的数学库。
pow
的代码是数学库的一部分。 您需要链接到该库(除了默认链接的C库)。
为此,使用gcc,在编译器调用上指定-lm
gcc ... -lm
http://www.cplusplus.com/reference/clibrary/cmath/pow/
在C中,只有具有此名称的两个双参数的版本存在。 其他重载仅在C ++中可用。
看起来你不能传递一个int,所以只要让i
成为一个双重的,那应该有效。