我收到一条错误,上面写着“错误:'____'的类型冲突。这是什么意思?
答案 0 :(得分:11)
的QuickFix:
确保您的函数在调用之前只声明一次并且只声明一次。例如,更改:
main(){ myfun(3.4); } double myfun(double x){ return x; }
要:
double myfun(double x){ return x; } main(){ myfun(3.4); }
或添加单独的函数声明:
double myfun(double x); main(){ myfun(3.4); } double myfun(double x){ return x; }
error: conflicting types for ‘foo’
表示使用不同的类型签名多次定义函数。
包含两个具有相同名称但返回类型不同的函数的文件会抛出此错误,例如:
int foo(){return 1;}
double foo(){return 1.0;}
实际上,在使用GCC编译时,我们会遇到以下错误:
foo.c:5:8: error: conflicting types for ‘foo’
double foo(){return 1.0;}
^
foo.c:4:5: note: previous definition of ‘foo’ was here
int foo(){return 1;}
^
现在,如果我们有一个文件,其中包含两个具有相同名称的函数定义
double foo(){return 1;}
double foo(){return 1.0;}
我们会收到'重新定义'错误:
foo.c:5:8: error: redefinition of ‘foo’
double foo(){return 1.0;}
^
foo.c:4:8: note: previous definition of ‘foo’ was here
double foo(){return 1;}
^
那么为什么以下代码抛出error: conflicting types for ‘foo’
?
main(){ foo(); }
double foo(){ return 1.0; }
原因是隐式函数声明。
当编译器第一次遇到foo()
函数中的main
时,它将假定foo
的函数int foo()
的类型签名。默认情况下,假定隐式函数返回整数,输入参数类型是从您传递给函数的内容派生的(在本例中,没有)。
显然,编译器做出这个假设是错误的,但是C(以及Objective-C)语言的规范是古老的,胡思乱想的,而且不是很聪明。也许通过在当天减少编译器复杂性来隐式声明函数节省了一些开发时间,但是现在我们遇到了一个应该从未进入语言的可怕特性。事实上,隐含的声明在C99中是非法的。
那就是说,一旦你知道发生了什么,就应该很容易找出问题的根本原因。
答案 1 :(得分:3)
可能是因为你的函数“ _ ”已经存在于你的库中。这个功能发生在我身上:
我使用的是stdio.h
int getline(char s [],int lim) { int c,i;
for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
当我将“getline”更改为“getlinexxx”并且gcc编译它时:
int getlinexxx(char s [],int lim) { int c,i;
for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
问题已经消失了
答案 2 :(得分:0)
什么数据类型是'___'?
我的猜测是你试图初始化一个不能接受初始值的类型的变量。就像说int i = "hello";
答案 3 :(得分:0)
如果您尝试从返回NSMutableDictionary的调用中分配它,那可能是您的麻烦。发布代码行肯定有助于诊断警告和错误。