现在我正在为我的系统编程课程开展一个项目。我们被要求与房地产经纪人和客户一起编制公寓销售平台。我正在研究Eclipse。
现在,即使我在过去没有遇到任何问题,我的一个头文件也无法识别第二个头文件中的typedef。
说明:这是我的文件;
Realtor.h
#include "apartment.h"
#include "apartment_service.h"
#include "Report.h"
#include "Customer.h"
#include "mtm_ex2.h"
typedef struct realtor_t* Realtor;
虽然这是第二个头文件;
Customer.h
#include "Report.h"
#include "Realtor.h"
#include "apartment.h"
#include "apartment_service.h"
#include "mtm_ex2.h"
typedef struct customer_t* Customer;
MtmErrorCode purchaseApartment (Customer customer, Realtor realtor,
ApartmentService service,
int apartment_id);
MtmErrorCode makeOffer (Customer customer, Realtor realtor, ApartmentService
service, int apartment_id, int new_price);
(customer_t和realtor_t的结构在源文件中定义)
由于某种原因,Customer.h中的函数声明给出了以下错误:“未知类型名称'Realtor'”。这真的很奇怪,因为相同的函数使用其他typedef,例如“apartment_service.h”中的'ApartmentService'。
答案 0 :(得分:2)
您在Realtor.h中包含Customer.h。
这是发生错误的地方。在Realtor.h中,Realtor
的typedef未在Customer.h
从Realtor.h中删除Customer.h的包含。这应该可以解决给定代码的问题。
答案 1 :(得分:0)
你根本不应该这样做。您应该在代码文件中包含这些包含文件,而不是包含文件。
在头文件中添加typedef struct customer_t* Customer;
之类的声明很好。在定义指向某种类型的指针时,您不需要这样的声明来了解更多内容。这就是编译器需要知道的所有原型。
修改
每个模块应该只导出它所提供的内容,并且总数应该“建立”,因此最好没有循环依赖。所以公寓是一个基础“类”,公寓服务使用公寓;客户是基础“类”,您的程序具有客户购买公寓的功能。有时无法阻止循环引用或前向引用。在这种情况下,您应该使用“include guard”来确保包含文件的内容只包含一次。
/* apartment.h */
#ifndef APT_INCLUDED
#define APT_INCLUDED
typedef struct Apartment* tApartmemt;
tApartment NewApartment(char * name);
#endif /*APT_INCLUDED*/
/* apartment_services.h */
#ifndef APTSVC_INCLUDED
#define APTSVC_INCLUDED
#include "apartment.h"
typedef struct ApartmentService* tAptSvc;
tAptSvc NewAptSvc(tApartment apartment, char *svcname);
#endif /*APTSVC_INCLUDED*/
好好了解谁还需要知道什么可以简化您的包含结构,例如,我怀疑makeOffer
应该是客户模块的一部分,因此模块不需要包括公寓或房地产经纪人;相反,是提供报价的房地产经纪人。我还注意到你的包含似乎有点随机顺序。无论如何,使用包含警卫可以防止循环包含,并应解决您原来的问题。我希望这有点帮助。
答案 2 :(得分:0)
将typedef struct realtor_t* Realtor;
行放在Customer.h
头文件中的Realtor.h
之前。