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;
}
编译之后就出现如下错误:
我在网上查的原因有可能是因为函数使用的参数类型是自定义类型(结构体指针数组)或者头文件的被循环引用,但是排查了一圈没搞懂怎么回事,不知道有没有什么好的解决方法。
该回答引用ChatGPT4与博主@晓码自在合作编写:
根据你提供的信息,这个错误发生的原因是:bef_annahme()函数的定义中,struct befehle类型被定义在参数列表内部,而在头文件中其声明时却被定义在参数列表外部。这导致这两个bef_annahme()有冲突的类型。
解决方法是:将struct befehle的定义放在头文件中,以确保其在两个bef_annahme()中的类型是一致的。
具体步骤:
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_ */
c
#include "file_befehl.h"
int bef_annahme(int anzahl_zeile,char *zeile_inhalte[Anzahl_Befehle_Max],struct befehle *bef_kette[Anzahl_Befehle_Max])
{
// ...
}
通过在头文件中定义struct befehle,保证了它在bef_annahme()的声明和定义中具有相同的类型,消除了类型冲突的错误。
struct befehle; 结构体的声明应该在自定义的头文件里,主函数里的结构体定义应取消。
#define Line_Max 1024 #define Anzahl_Befehle_Max 1024 在自定义头文件里定义就好了,其它两个地方的定义应取消。