接收错误:尝试编译时“六”的冲突类型。
void main(){
const int k = 4;
six(&k);
}
float * six(const int *x)
{
float *p = malloc(sizeof(float));
*p = (float)*x;
return p;
}
答案 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编译器按函数编译代码函数,并且会在汇编中生成函数调用语句,因此编译器需要知道函数参数和返回值数据类型,以便它可以生成正确的指令做参数传递,返回值恢复。通常,编译器会在文件开头到文件末尾逐个编译源代码文件中的函数,因此在使用之前需要声明函数类型。