C - неизвестное имя типа - PullRequest
0 голосов
/ 17 мая 2018

Мне нужно создать «социальную сеть» для колледжа, но я всегда получаю неизвестное имя типа «Список» при компиляции. Я удалил много функций из своих заголовков, но все равно получаю ту же ошибку и не знаю почему. У меня есть 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);
}

Спасибо за чтение.

1 Ответ

0 голосов
/ 17 мая 2018

Вот (первая) ошибка, которую я получаю, когда пытаюсь скомпилировать этот набор файлов:

$ 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);

Посмотрите на имена файлов и номера строк. Обратите внимание, что в строке 4 ListHeadTail.h вы уже определили 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. То же самое касается функции changeData в Student.h.

В объектно-ориентированном дизайне (скажем, в Java) все эти функции, вероятно, будут методами класса List и будут объявлены в исходном файле этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...