gcc编译C程序出现”error conflicting types for function”编译错误的分析解决

在使用gcc编译C程序时,有时会碰到“error: conflicting types for ‘function’”的编译错误。从字面意义上理解,是说函数的定义和声明不一致。在这篇文章里,我就对这个错误做个简单的分析(使用的gcc版本是4.9.0)。

(一)首先我们看一个函数的定义和声明不一致的例子:

#include <stdio.h>

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 <stdio.h>

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,所有编译警告都关掉了,也许是编译警告太多了吧。

时间: 2024-09-20 16:03:06

gcc编译C程序出现”error conflicting types for function”编译错误的分析解决的相关文章

Linux下编程时的conflicting types for &#039;dev_t&#039;问题

在Linux下编译程序有时会遇到这种问题,这貌似是一个Linux历史遗留问题: /usr/include/sys/types.h:62: error: conflicting types for 'dev_t' /usr/include/linux/types.h:13: error: previous declaration of 'dev_t' was here /usr/include/sys/types.h:67: error: conflicting types for 'gid_t'

VS 2005编译的程序不能运行的几个解决方法

这两天有点焦头烂额, 我们这边运行的好好的程序, 到了测试的机器上就不能启动(是根本运行不了, 而不是运行出错), 弄得我异常郁闷. 经过了一番摸索, 发现和 winxp.win2003中为解决dll hell而引入的manifest机制有关系.而以前我们用vs2003开发, 它并没有强制程序使用manifest, 但到了vs2005中, 这已经改成必需的了, 而我们并没有按照需要进行相关的配置, 所以程序启动不了了. 根据目前的经验, vs2005编译的程序不能启动大致有两个原因, 下面简单介

在Visual Studio 2008中编译F#程序

在Visual Studio 2008中,编译F#程序时,会出现警告(但不是错误),但是由于这个警告却使你的程序无法运行,不过大多数据这些警告都会有提示,提示你用.NET里的函数代替F#中的某些函数,但是这些.NET中的函数又不能像在C#中那样使用. 例如: #light let one = ["one "] let two = "two " :: one let three = "three " :: two let rightWayRound

class-cmd编译java程序时的一个问题

问题描述 cmd编译java程序时的一个问题 使用javac编译一个java程序时,如果该java文件导入了其他的类,只能将导入的类一个一个手动编译吗?有没有什么其他便捷的方法? 解决方案 Exception in thread "main" java.lang.NoClassDefFoundError: comexampleMain 问题一个解决思路......答案就在这里:编译java程序时的一个问题 解决方案二: 如果是测试的话你也可以把其他类嵌套到一个类测试,这样就可以监测其功

抽取VS文件组成类GCC的编译器并编译C程序为dll动态链接库

用惯了linux下的GCC编译工具,倒喜欢起命令行的方式编译链接C程序,居然还发现我装的VS工具没看到直接编译C程序的工具(我不太熟悉这个).VS的编译文件命令是cl,链接命令是link.参考了网上资料,采用提取VS的编译器文件组成一个可以命令行方式编译程序的工具.以下为步骤: 1,在自己目录创建文件夹,如:D:/vctool; 2,将VS安装目录下的VC目录下的bin.lib.include目录考到vctool目录下: 3,将c:/Program Files/Microsoft SDKs/Wi

c语言-Linux下使用gcc编译c11程序是不是过于麻烦了?

问题描述 Linux下使用gcc编译c11程序是不是过于麻烦了? 每次都要输入-std=c11 是不是过于麻烦了?怎么让它默认为-std=c11? 解决方案 因为它默认是c89等标准,所以需要指定 你可以写一个makefile ,这样每次只用make来编译

linux-qt上编译opencv程序出错

问题描述 qt上编译opencv程序出错 编译提取棋盘格角点的的程序,但是一直显示cvFindChessboardCorners这个函数有问题,请大神指教! 错误如下: ../qt_subpix1/main.cpp: In function 'int main(int, char**)': ../qt_subpix1/main.cpp:14:19: warning: deprecated conversion from string constant to 'char*' [-Wwrite-st

VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题

  使用VS2008编译了一个程序,使用到自己编译的DLL,丢到某些机子上无法运行,提示"由于应用程序配置不正确,应用程序未能启动"的错误,装了vcredist_x86也没有用,开始以为是DLL的问题,后来换个简单的程序,仍然不行,百撕不得其解,后来上网找,下面有说了很多解决办法.         我最终的解决办法是复制本机中的.manifest文件,修改里面的版本号,复制到提示错误的机子上,与可执行程序放在同一目录就可以了.在计算机中管理的系统工具,事件查看器可以查看应用程序的消息,

file-solaris下编译的程序执行是出现段错误

问题描述 solaris下编译的程序执行是出现段错误 编译器版本Reading specs from /usr/sfw/lib/gcc/sparc-sun-solaris2.10/3.4.3/specs Configured with: /sfw10/builds/build/sfw10-patch/usr/src/cmd/gcc/gcc-3.4.3/configure --prefix=/usr/sfw --with-as=/usr/ccs/bin/as --without-gnu-as --