"'的错误冲突类型是什么意思?

use*_*721 3 iphone xcode

我收到一个错误,上面写着"错误:'____'的冲突类型.这是什么意思?

bri*_*ice 11

快速解决:

确保在调用函数之前只声明一次函数.例如,更改:

main(){ myfun(3.4); }
double myfun(double x){ return x; }
Run Code Online (Sandbox Code Playgroud)

至:

double myfun(double x){ return x; }
main(){ myfun(3.4); }
Run Code Online (Sandbox Code Playgroud)

或者添加一个单独的函数声明:

double myfun(double x);
main(){ myfun(3.4); }
double myfun(double x){ return x; }
Run Code Online (Sandbox Code Playgroud)

可能的错误原因

  1. 函数在声明之前被调用
  2. 定义的函数会覆盖在包含的头中声明的函数.
  3. 函数在同一文件中定义了两次
  4. 声明和定义不符
  5. 包含标题中的声明冲突

到底是怎么回事

error: conflicting types for ‘foo’ 表示使用不同类型签名多次定义函数.

包含两个具有相同名称但返回类型不同的函数的文件会抛出此错误,例如:

int foo(){return 1;}
double foo(){return 1.0;}
Run Code Online (Sandbox Code Playgroud)

实际上,在使用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;}
     ^
Run Code Online (Sandbox Code Playgroud)

现在,如果我们有一个文件,其中包含两个具有相同名称的函数定义

double foo(){return 1;}
double foo(){return 1.0;}
Run Code Online (Sandbox Code Playgroud)

我们会得到一个'重新定义'错误:

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;}
        ^
Run Code Online (Sandbox Code Playgroud)

隐含的函数声明

那么为什么以下代码抛出error: conflicting types for ‘foo’

 main(){ foo(); }
 double foo(){ return 1.0; }
Run Code Online (Sandbox Code Playgroud)

原因是隐式函数声明.

当编译器第一次遇到foo()main功能,将承担功能的类型签名fooint foo().默认情况下,假定隐式函数返回整数,输入参数类型是从您传递给函数的内容派生的(在本例中,什么都不是).

显然,编译器做出这个假设是错误的,但是C(以及Objective-C)语言的规范是古老的,胡思乱想的,而且不是很聪明.也许通过在当天减少编译器复杂性来隐式声明函数节省了一些开发时间,但是现在我们遇到了一个应该从未进入语言的可怕特性.事实上,隐含的声明在C99中是非法的.

也就是说,一旦你知道发生了什么,就应该很容易找出问题的根本原因.