0

pow 不接受第二个参数作为 gcc 上的变量

以下代码在 VC++10 上运行良好

// file test.cc
#include "stdafx.h"
#include <stdio.h>
#include <math.h>

int main(void)
{   
    double x = 10;
    int y = 20;
    printf("%f\n", pow(x, y));
    return 0;
}

但以下代码不适用于 gcc:

// test.c
#include <stdio.h>
#include <math.h>

int main(void)
{   
    double x = 10;
    int y = 20;
    printf("%f\n", pow(x, y)); // error here, says no such function, however when pass the second argument in `pow` for the code runs by gcc, It works fine!
    return 0;
}
4

2 回答 2

6

你错了。它与第二个参数无关。

在 POSIXish 系统pow()中,它位于 libm 中,而在 win32ish 系统中,它是标准 C 库的一部分。意味着而不是这个:

$ gcc program.c
/tmp/ccTw1gCA.o: In function `main':
program.c:(.text+0x30): undefined reference to `pow'

你需要这样做:

$ gcc program.c -lm
于 2010-05-19T14:16:02.037 回答
2

看起来第二个参数作为常量而不作为变量起作用的原因是 gcc 具有 pow() 的内置实现。如果第二个参数是一个常量,它可能会使用它,如果它是一个变量,它会退回到 glibc pow() 函数。看:

http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Other-Builtins.html#Other-Builtins

如果您将-fno-builtin传递给 gcc,您应该会看到一致的行为——在这种情况下,无论您将什么传递给 pow(),都会出现错误消息。正如其他人所提到的,每当您使用 math.h 之外的任何内容时,您都需要与-lm链接。

于 2010-05-24T02:58:51.277 回答