C的pow函数拒绝使用变量指数

时间:2010-12-13 16:33:50

标签: c pow

假设我有以下代码段:

int i; double value;
for(i = 0; i < CONSTANT; i++) {
  value = (double)pow(2, i);
}

尝试编译此代码会产生“未定义的对'pow'的引用”错误。

包含或排除math.h没有任何区别,因为它最终会被包括在内。

2.0提升为硬编码电源可以正常工作,但如果我用包含i的表达式替换指数,则一切都会失败。

我做错了什么?感谢。

5 个答案:

答案 0 :(得分:16)

这是一个非常有趣的行为,也是一个很好的学习范例。

要解决您的问题,请添加

-lm

到你的gcc命令行(如果你正在使用gcc)。这告诉编译器链接数学库。

似乎正在发生的事情是,如果你正在使用

pow(2.0, 3);

编译器意识到这个表达式的计算结果是一个常量,并且仅仅是替换。

因此,不必调用库函数。

答案 1 :(得分:3)

您需要与-lm链接以实际包含数学库。

它适用于硬编码值,因为编译器优化了pow调用。

答案 2 :(得分:3)

您必须链接数学库:

gcc program.c -lm

原因是GCC(以及其他一些编译器)对文字常量有一个内置的pow()函数。因此,如果您手动调用pow()和2.0,编译器将实际找出答案是什么,并替换为您。使用变量输入,编译器必须依赖于必须链接的数学库。

答案 3 :(得分:1)

pow的代码是数学库的一部分。您需要链接到该库(除了默认链接的C库)。

为此,使用gcc,在编译器调用上指定-lm

gcc ... -lm

答案 4 :(得分:0)

http://www.cplusplus.com/reference/clibrary/cmath/pow/

  

在C中,只有带有两个双参数的版本才有此名称。其他重载仅在C ++中可用。

看起来你无法传递一个int,所以只需将i设为双精度即可。