C-未知类型名称

C-未知类型名称,c,struct,C,Struct,我需要为大学建立一个“社交网络”,但我在编译时总是得到一个未知类型的名字“列表”。我从我的头中删除了很多函数,但是我仍然得到同样的错误,我不知道为什么。 我有3个标题: 我朋友的头球 #ifndef FRIEND_H #define FRIEND_H #include "ListHeadTail.h" typedef struct Friend{ int id; struct Friend *nextFriend; }Friend; void printFriends(Li

我需要为大学建立一个“社交网络”,但我在编译时总是得到一个未知类型的名字“列表”。我从我的头中删除了很多函数,但是我仍然得到同样的错误,我不知道为什么。 我有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);
}
#包括
#包括
#包括“ListHeadTail.h”
#包括“Friend.h”
#包括“Student.h”
int main(int argc,字符**argv){
清单l;
惊吓者;
自由列表(&l);
返回(退出成功);
}
感谢阅读。

这是我尝试编译这组文件时遇到的(第一个)错误:

$ 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\u h
,但还没有达到
List
的实际声明。然后进入Student.h,然后进入Friend.h。这又包括了ListHeadTail.h——但是由于已经定义了
ListHeadTail\u h
,所以这个包含什么都不做。因此,您继续通过Friend.h,而没有声明
List
,因此在引用它的声明上会得到一个错误

正如@潜伏者在他们的评论中所指出的,这里的基本问题是循环依赖,一个简单的修复方法是转发声明。在这种情况下,您可以简单地修改Friend.H,将
#include“ListHeadTail.H”
替换为
typedef结构列表

但对我来说,这有点老套。如果将include的顺序移到某个地方,构建可能会再次中断

我认为真正的问题是函数(
printFriends
等)的声明不属于Friend.h;它们属于ListHeadTail。这些函数与
Friend
类型无关。当然,他们的名字中有“Friend”,但声明中引用的唯一类型是
List
。所以它们属于ListHeadTail。Student.h中的
changeData
函数也是如此


在面向对象的设计中(比如,在Java中),这些函数都可能是List类的方法,并将在该类的源文件中声明。

您的
main
首先包括
ListHeadTail.h
,其中将包括
Student.h
。然后,
Student.h
将包括
Friend.h
,所有这些都按顺序排列
Student.h
将尝试在实际定义之前使用
ListHeadTail.h
中定义的内容(尚未解析
ListHeadTail.h
的完整主体)。当你有一个循环依赖项时,你需要使用。你是对的。我刚刚更改了代码,现在它可以工作了。谢谢。是的,你是对的,这些函数和朋友类型无关,我会尝试更改我的代码,这样我的朋友类型只会得到和朋友相关的函数。非常感谢。