警告:内置函数log2的不兼容的隐式声明

时间:2013-05-07 17:41:16

标签: c compiler-errors logarithm

所以我们在C中有这个程序,我们需要使用base-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 

1 个答案:

答案 0 :(得分: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时,我得到了:

  

a.c :(。text + 0x11):未定义的引用`log2'
  collect2:ld返回1退出状态

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

  

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

嘿,这是你的警告!因此,您可能正确包含-lm,但由于某种原因,#include math.h存在问题。可能是这样:

  1. math.h缺失
  2. 你没有真正将它包含在文件中,是在#def中并且正在编译出来吗?
  3. 您的math.h版本未定义log2