错误:使用gcc与'six'冲突的类型

时间:2013-09-03 01:21:28

标签: c gcc

接收错误:尝试编译时“六”的冲突类型。

void main(){
    const int k = 4;
    six(&k);
}

float * six(const int *x)
{
    float *p =  malloc(sizeof(float));
    *p = (float)*x;
    return p;
}

3 个答案:

答案 0 :(得分:6)

这是正在发生的事情。

当编译器在调用之前没有遇到函数的原型时,它会从调用本身推断出原型,并假设返回类型为int。这就是它在你的例子中的作用。

稍后它找到了函数的定义,并且发现返回类型实际上是float,它与之前推导出的原型不匹配。因此,冲突类型的错误(而不是缺少原型)。

当然,解决方案是在调用函数之前为函数提供原型。

答案 1 :(得分:5)

在调用之前,您没有向编译器声明six,因此编译器被迫猜测six的签名是什么(通常,这类似于int func() )。当它看到实际的声明时,它抛出了一个错误,因为实际的函数声明与它的隐式声明不匹配。

您需要在使用之前声明函数;发布像

这样的声明
float *six(const int *x);
main之前

答案 2 :(得分:3)

解决您的问题

只需在main()之前添加以下声明:

float *six(const int *x);

或者将float *six(const int *x)定义放在main()函数之前。

为什么编译器会抱怨conflicting types

由于在编译器编译main函数之前没有声明six()函数,它将从函数调用点推断出原型,并假设返回类型为int。当它编译你的six()函数时,编译器将找到两个具有相同名称但返回类型不同的函数,因此它会抱怨conflicting types错误。

感谢Ziffusion的评论。

为什么要以上述方式调整代码

您应该在使用C之前声明/定义每个元素。

对于您当前的代码,您需要在main函数之前声明您的函数类型,以便编译器在编译six()函数时知道main是什么。

为什么在使用C

之前应该有声明

对于变量和其他数据类型,因为C是强类型的。当使用变量时,需要先声明它,以便编译器知道变量的类型,并可以进行数据类型检查。

对于函数,由于C编译器按函数编译代码函数,并且会在汇编中生成函数调用语句,因此编译器需要知道函数参数和返回值数据类型,以便它可以生成正确的指令做参数传递,返回值恢复。通常,编译器会在文件开头到文件末尾逐个编译源代码文件中的函数,因此在使用之前需要声明函数类型。