bri*_*ice 11
快速解决:
确保在调用函数之前只声明一次函数.例如,更改:
Run Code Online (Sandbox Code Playgroud)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; }
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功能,将承担功能的类型签名foo的int foo().默认情况下,假定隐式函数返回整数,输入参数类型是从您传递给函数的内容派生的(在本例中,什么都不是).
显然,编译器做出这个假设是错误的,但是C(以及Objective-C)语言的规范是古老的,胡思乱想的,而且不是很聪明.也许通过在当天减少编译器复杂性来隐式声明函数节省了一些开发时间,但是现在我们遇到了一个应该从未进入语言的可怕特性.事实上,隐含的声明在C99中是非法的.
也就是说,一旦你知道发生了什么,就应该很容易找出问题的根本原因.
| 归档时间: |
|
| 查看次数: |
22777 次 |
| 最近记录: |