0

所以我们在 C 语言中有这个程序,我们需要使用以 2 为底的对数函数,来获得 n 的以 2 为底的对数。这是代码:

#include <math.h>

int partSize(int n) {
    return log2(n);
}

但是在编译时,它给了我们以下警告。

sim.c:在函数partSize中:sim.c:114:警告:内置函数的不兼容隐式声明log2

这是我们使用的命令

 gcc $file -o $name.out -lm 
4

1 回答 1

7

事情就是这样,99.99999% 的情况下,当有人说“这个全世界都可以使用的基本功能不起作用”时,他们错了。当这个基本的东西坏掉的时候,已经有一支军队在某个地方拿着干草叉了。

#include <math.h>
#include <stdio.h>

int partSize(int n){
    return log2(n);
}

int main(int argc, char *argv[]) {
    int ret = -1;
    ret = partSize(16);
    printf("%d\n", ret);
    return 0;
}

编译:

 > gcc -std=c99 a.c -o log2.out -lm
 > ./log2.out 
 > 4

是的,它正在工作。

在 C 中,使用以前未声明的函数构成函数的隐式声明。在隐式声明中,返回类型是int. 因此,错误告诉log2()您代码中未定义这会导致您未发布的代码中出现一些问题。

当我跳过-lm我得到:

ac:(.text+0x11): undefined reference to `log2'
collect2: ld returned 1 exit status

..这看起来不对。好的,当我添加-lm但删除时,#include <math.h>我得到:

ac:在函数'partSize'中:
ac:5:5:警告:函数'log2'的隐式声明[-Wimplicit-function-declaration]

嘿,这是你的警告!所以你可能是正确的,你包括-lm但由于某种原因#include math.h有问题。可能是这样的:

  1. math.h 丢失
  2. 你并没有真正将它包含在文件中,它是否在 #def 中并被编译出来?
  3. 您的 math.h 版本没有定义 log2
于 2013-05-07T19:03:25.833 回答