0

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

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

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

3 回答 3

6

这是正在发生的事情。

当编译器在调用函数之前没有遇到函数原型时,它会从调用本身推导出原型,并假定返回类型为 int。这就是它在您的示例中所做的。

后来找到函数的定义,发现返回类型其实是float,和之前推导出的原型不匹配。因此,类型冲突的错误(而不是缺少原型)。

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

于 2013-09-03T02:00:42.873 回答
5

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

您需要在使用函数之前声明它们;像这样声明

float *six(const int *x);

之前main

于 2013-09-03T01:26:48.347 回答
3

解决您的问题

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

float *six(const int *x);

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

为什么编译器抱怨conflicting types

由于在编译器编译主函数之前没有声明你six()的函数,它会从函数调用点推导出原型,并假设返回类型为int. 而且当它编译你的six()函数时,编译器会找到两个同名但返回类型不同的函数,所以它会conflicting types报错。

感谢 Ziffusion 的评论。

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

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

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

为什么在 C 中使用之前应该有一个声明

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

对于函数,由于C编译器是逐个函数编译代码,并且会在汇编中生成函数调用语句,所以编译器需要知道函数参数和返回值数据类型,才能生成正确的做参数指令传递和返回值恢复。通常情况下,编译器会从文件的开头到文件的结尾一个一个地编译源代码文件中的函数,所以在使用前需要声明函数类型。

于 2013-09-03T01:48:33.880 回答