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

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

该回答引用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()的声明和定义中具有相同的类型,消除了类型冲突的错误。

struct befehle; 结构体的声明应该在自定义的头文件里,主函数里的结构体定义应取消。
#define Line_Max 1024 #define Anzahl_Befehle_Max 1024 在自定义头文件里定义就好了,其它两个地方的定义应取消。