C 头文件中的未知类型名称

Unknown type name in C header file

我在编译我的项目时遇到问题。我正在尝试将一个结构放入队列中,该结构已在头文件中贴标,如下所示:

预约函数头文件(“signupFunctions.h”是我的“患者”声明所在的位置):

#ifndef appointmentFunctions_H__
#define appointmentFunctions_H__

#include "queueFunctions.h"
#include "signupFunctions.h"

typedef struct{
    int cough;
    int rDistress;
    int fatigue;
    int fever;
}symptoms;

typedef symptoms *Symptoms;

typedef struct {
    Patient patient;
    Symptoms symptoms;
    int day;
    int mon;
    int year;
    int flag;
}appointment;

typedef appointment *Appointment;

int getSymptomsValue(Appointment A);
void setSymptoms(Appointment A);
void requestAppointment(Patient P, qNodePtr *head, qNodePtr *tail);

#endif

队列函数头文件:

#ifndef queueFunctions_H__
#define queueFunctions_H__

#include "appointmentFunctions.h"

typedef struct qNode{
    Appointment A;
    struct qNode *next;
}QueueNode;

typedef QueueNode *qNodePtr;

void printQueue(qNodePtr currentPtr);
int isEmpty(qNodePtr head);
void dequeue(qNodePtr *head, qNodePtr *tail);
void enqueue(qNodePtr *head, qNodePtr *tail, Appointment App);

#endif

编译后得到:

In file included from appointmentFunctions.h:4:0,
                 from menuFunctions.h:5,
                 from main.c:4:
queueFunctions.h:7:2: error: unknown type name 'Appointment'
  Appointment A;
  ^~~~~~~~~~~
queueFunctions.h:16:46: error: unknown type name 'Appointment'
 void enqueue(qNodePtr *head, qNodePtr *tail, Appointment App);
                                              ^~~~~~~~~~~
In file included from appointmentFunctions.h:4:0,
                 from menuFunctions.h:5,
                 from signupFunctions.c:5:
queueFunctions.h:7:2: error: unknown type name 'Appointment'
  Appointment A;
  ^~~~~~~~~~~
queueFunctions.h:16:46: error: unknown type name 'Appointment'
 void enqueue(qNodePtr *head, qNodePtr *tail, Appointment App);
                                          ^~~~~~~~~~~

..等等。有什么问题?提前致谢。

在 appointmentFunctions.h 中包含 queueFunctions.h

所以当 queueFunctions.h 被读取时,类型 Appointment 是未知的。

queueFunctions.h也包括appointmentFunctions.h对你没有帮助,因为那时appointmentFunctions_H__已经定义了,即不会读取文件内容。

如果文件 X.h 依赖于文件 Y.h 中的某些内容,同时 Y.h 依赖于文件 X.h 中的某些内容,则您的设计错误必须是已修复。

据我所知,依赖只是 指向结构的指针,因此您可以通过向前声明结构来摆脱依赖。

在 queueFunctions.h 中进行以下更改:

#include "appointmentFunctions.h" --> struct appointment;

Appointment --> struct appointment*

顺便说一句:它是基于意见的,但大多数程序员避免将 typedef 用于指针。如果完成了,通常最好使用一个可以清楚地表明这是一个指针的名称,例如:

typedef appointment *Appointment; --> typedef appointment *appointmentPtr;

您递归地将一个 header 包含在另一个

#ifndef appointmentFunctions_H__
#define appointmentFunctions_H__

#include "queueFunctions.h"
#include "signupFunctions.h"
//...

#ifndef queueFunctions_H__
#define queueFunctions_H__

#include "appointmentFunctions.h"
//...

所以编译器报错

你不应该那样做。

也就是headerappointmentFunctions.h一下包含了headerqueueFunctions.h里面有声明

typedef struct qNode{
    Appointment A;
    struct qNode *next;
}QueueNode;

但是 Appointment 的声明还不可见。在包含 header queueFunctions.h.

之后