题
假设我有以下代码段:
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
双重,应该起作用。
不隶属于 StackOverflow