KUDO_WYF 2023-05-24 20:52 采纳率: 83.3%
浏览 62
已结题

C语言关于"error: conflicting types for '...' "的问题

error: conflicting types for 'bef_annahme'
我定义了一个叫bef_annahme的函数,编译时一直报错,但是排查后还是不明白问题出在哪里
定义的头文件如下所示:

#ifndef FILE_BEFEHL_H_
#define FILE_BEFEHL_H_

#define Line_Max 1024
#define Anzahl_Befehle_Max 1024
int bef_annahme(int anzahl_zeile,char *zeile_inhalte[Anzahl_Befehle_Max],struct befehle *bef_kette[Anzahl_Befehle_Max]);

#endif /* FILE_BEFEHL_H_ */

下面是定义的函数:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "file_befehl.h"

#define Line_Max 1024
#define Anzahl_Befehle_Max 1024

struct befehle
{
    int nr_bef;
    char bef[Line_Max];
    struct befehle *naechst;
    struct befehle *vorne;
};

int bef_annahme(int anzahl_zeile,char *zeile_inhalte[Anzahl_Befehle_Max],struct befehle *bef_kette[Anzahl_Befehle_Max])
{
    int bef_zaehler = 0;
    for(int i = 0;i < anzahl_zeile;i++)
    {
        if(zeile_inhalte[i][0] == ';')
        {
            continue;
        }
//        bef_kette[i] = (struct befehle *)malloc(sizeof(struct befehle));
//        bef_kette[i]->bef = zeile_inhalte[i];
        strcpy(bef_kette[i]->bef,zeile_inhalte[i]);
        strtok(bef_kette[i]->bef,";");
        bef_zaehler++;
    }

    bef_kette[0]->vorne = bef_kette[0];
    bef_kette[0]->naechst = bef_kette[1];

    bef_kette[bef_zaehler-1]->naechst = NULL;
    bef_kette[bef_zaehler-1]->vorne = bef_kette[bef_zaehler-2];
    bef_kette[bef_zaehler-1]->nr_bef = bef_zaehler;

    for(int i = 1;i < bef_zaehler-1;i++)
    {
        bef_kette[i]->vorne = bef_kette[i-i];
        bef_kette[i]->naechst = bef_kette[i+i];
        bef_kette[i]->nr_bef = i + 1;
    }
    return bef_zaehler;
}

下面是main.c文件:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "file_operation.h"
#include "file_befehl.h"

#define Line_Max 1024
#define Anzahl_Befehle_Max 1024

struct befehle
{
    int nr_bef;
    char bef[Line_Max];
    struct befehle *naechst;
    struct befehle *vorne;
};

int main(void)
{
    char path[] = "C:/Ec_WS/arbeitsraum";
    char name[] = "test.txt";
    char *zeile_inhalte[Anzahl_Befehle_Max] = {NULL};
    struct befehle befehl_kette[Anzahl_Befehle_Max] = {NULL};

    for(int i = 0;i < Anzahl_Befehle_Max;i++)
    {
        zeile_inhalte[i] = (char *) malloc(Line_Max*sizeof(char));
    }
    int a = fileOperation(path,name,zeile_inhalte);
    printf("%d\n",a);
    fflush(stdout);
    for(int i = 0;i < a;i++)
    {
        printf("%3d:  %-50s\n",i,zeile_inhalte[i]);
        fflush(stdout);
    }

    printf("------------------------------------------\n");
    fflush(stdout);
    printf("------------------------------------------\n");
    fflush(stdout);

    for(int i = 0;i < a;i++)
    {
        befehl_kette[i] = (struct befehle *)malloc(sizeof(struct befehle));
    }

    int b = bef_annahme(a,zeile_inhalte,befehl_kette);

    for(int i = 0;i < Anzahl_Befehle_Max;i++)
    {
        free(zeile_inhalte[i]);
    }

    for(int i = 0;i < b;i++)
    {
        free(befehl_kette[i]);
    }

    return 1;
}

编译之后就出现如下错误:

img

我在网上查的原因有可能是因为函数使用的参数类型是自定义类型(结构体指针数组)或者头文件的被循环引用,但是排查了一圈没搞懂怎么回事,不知道有没有什么好的解决方法。

  • 写回答

2条回答 默认 最新

  • @晓码自在 2023-05-24 21:24
    关注

    该回答引用ChatGPT4与博主@晓码自在合作编写:

    根据你提供的信息,这个错误发生的原因是:bef_annahme()函数的定义中,struct befehle类型被定义在参数列表内部,而在头文件中其声明时却被定义在参数列表外部。这导致这两个bef_annahme()有冲突的类型。

    解决方法是:将struct befehle的定义放在头文件中,以确保其在两个bef_annahme()中的类型是一致的。

    具体步骤:

    1. 在file_befehl.h头文件中定义struct befehle:
    c
    #ifndef FILE_BEFEHL_H_ 
    #define FILE_BEFEHL_H_
    
    #define Line_Max 1024  
    #define Anzahl_Befehle_Max 1024  
    
    struct befehle 
    {
        int nr_bef;
        char bef[Line_Max];
        struct befehle *naechst;
        struct befehle *vorne;
    };
    
    int bef_annahme(int anzahl_zeile,char *zeile_inhalte[Anzahl_Befehle_Max],struct befehle *bef_kette[Anzahl_Befehle_Max]); 
    
    #endif /* FILE_BEFEHL_H_ */
    
    
    1. 在file_befehl.c中直接使用该类型,而不要再定义一遍:
    c
    #include "file_befehl.h"
    
    int bef_annahme(int anzahl_zeile,char *zeile_inhalte[Anzahl_Befehle_Max],struct befehle *bef_kette[Anzahl_Befehle_Max]) 
    {
        // ...
    }
    
    
    1. 编译通过!

    通过在头文件中定义struct befehle,保证了它在bef_annahme()的声明和定义中具有相同的类型,消除了类型冲突的错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月24日
  • 已采纳回答 5月24日
  • 创建了问题 5月24日

悬赏问题

  • ¥15 做数电题要具体的步骤
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!
  • ¥15 这个如何解决详细步骤