假设我有以下代码段:

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

原因是海湾合作委员会(和其他一些编译器)具有内置 pow() 字面常数的功能。所以如果你打电话 pow() 使用2.0手动,编译器实际上将找出答案是什么,并为您代替。使用变量输入,编译器必须依靠数学库,您必须链接到。

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

为此,使用GCC指定 -lm 在编译器调用中

gcc ... -lm

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

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

看起来您无法通过int,所以只要做 i 双重,应该起作用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top