我需要为大学建立一个“社交网络”,但在编译时我总是会得到未知的类型名称“List”。我从标题中删除了很多函数,但我仍然得到相同的错误,我不知道为什么。 我有3个标题:
我朋友的标题
#ifndef FRIEND_H
#define FRIEND_H
#include "ListHeadTail.h"
typedef struct Friend{
int id;
struct Friend *nextFriend;
}Friend;
void printFriends(List *l);
void removeFriend(List *l);
void addFriend(List *l);
#endif /* FRIEND_H */
我的列表标题:
#ifndef LISTHEADTAIL_H
#define LISTHEADTAIL_H
#include "Student.h"
typedef struct pStudent{
struct pStudent *ant;
Student *s;
struct pStudent *prox;
}pStudent;
typedef struct list{
pStudent *head;
pStudent *tail;
}List;
void startList(List *l);
void printList(List *l);
void freeList(List *l);
#endif /* LISTHEADTAIL_H */
我学生的标题
#ifndef STUDENT_H
#define STUDENT_H
#define MAX 51
#include "Friend.h"
#include "ListHeadTail.h"
typedef struct Student{
int id;
char name[MAX];
Friend *friends;
}Student;
Student* readStudent ();
void printStudent(Student* a);
void changeData(List *l);
#endif /* STUDENT_H */
我的主要人物:
#include <stdio.h>
#include <stdlib.h>
#include "ListHeadTail.h"
#include "Friend.h"
#include "Student.h"
int main(int argc, char** argv) {
List l;
startList(&l);
freeList(&l);
return (EXIT_SUCCESS);
}
感谢阅读。
答案 0 :(得分:0)
这是我尝试编译这组文件时遇到的(第一个)错误:
$ cc main.c
In file included from main.c:4:
In file included from ./ListHeadTail.h:4:
In file included from ./Student.h:6:
./Friend.h:11:19: error: unknown type name 'List'
void printFriends(List *l);
查看文件名和行号。请注意,在ListHeadTail.h第4行,您已经定义了LISTHEADTAIL_H
,但尚未达到List
的实际声明。然后你进入Student.h,然后进入Friend.h。这包括ListHeadTail.h - 但由于LISTHEADTAIL_H
已经定义,因此包含什么都不做。因此,您继续通过Friend.h而不声明List
,因此在引用它的声明中出错。
正如@lurker在评论中所指出的,这里的基本问题是循环依赖,简单的修正是前向声明。在这种情况下,您只需修改Friend.H,将#include "ListHeadTail.h"
替换为typedef struct list List;
。
但对我来说,这有点笨拙。如果你将包含的顺序转移到某处,那么构建可能会再次中断。
我认为真正的问题是函数的声明(printFriends
等)不属于Friend.h;它们属于ListHeadTail.h。这些函数与Friend
类型无关。当然,他们的名字中有“朋友”,但声明中引用的唯一类型是List
。所以他们属于ListHeadTail.h。 Student.h中的changeData
函数也是如此。
在面向对象的设计中(比如在Java中),这些函数可能都是List类的方法,并且将在该类的源文件中声明。