在使用gcc编译C程序时,有时会碰到“error: conflicting types for ‘function’”的编译错误。从字面意义上理解,是说函数的定义和声明不一致。在这篇文章里,我就对这个错误做个简单的分析(使用的gcc版本是4.9.0)。
(一)首先我们看一个函数的定义和声明不一致的例子:
#include
int func(int a);
int func(void) {
return 0;
}
int main(void) {
func();
return 0;
}
编译程序:
gcc -g -o a a.c
a.c:5:5: error: conflicting types for ‘func’
int func(void) {
^
a.c:3:5: note: previous declaration of ‘func’ was here
int func(int a);
可以看到由于“func”的声明和定义不一致(一个有参数,一个没有),所以编译时出现了这个错误。
(二)最近我在把一个老程序从Solaris移植到Linux,编译时也出现了这个错误。但是我发现函数在头文件里的声明和函数定义是完全一样的,这就令我很奇怪。查了将近一天时间,最后得到结论是函数参数类型在函数声明后定义了。简化的代码如下:
#include
void func(struct A *A);
struct A {
int a;
};
void func(struct A *A)
{
printf("%d", A->a);
}
int main(void) {
// your code goes here
struct A a = {4};
func(&a);
return 0;
}
其中“structure A”的定义放在“func”函数声明之后了,而func函数的参数是“structure A*”类型。编译结果如下:
gcc -g -o a a.c
a.c:3:18: warning: ‘struct A’ declared inside parameter list
void func(struct A *A);
^
a.c:3:18: warning: its scope is only this definition or declaration, which is probably not what you want
a.c:9:6: error: conflicting types for ‘func’
void func(struct A *A)
^
a.c:3:6: note: previous declaration of ‘func’ was here
void func(struct A *A);
^
可以看到也输出了“error: conflicting types for ‘func’”的编译错误,也许编译警告可以给一点提示吧。
我检查了一下程序的Makefile,所有编译警告都关掉了,也许是编译警告太多了吧。
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔