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
.
之后
我在编译我的项目时遇到问题。我正在尝试将一个结构放入队列中,该结构已在头文件中贴标,如下所示:
预约函数头文件(“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
.