头文件无法识别来自不同头文件的typedef

时间:2016-05-03 10:27:55

标签: c eclipse typedef

现在我正在为我的系统编程课程开展一个项目。我们被要求与房地产经纪人和客户一起编制公寓销售平台。我正在研究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'。

3 个答案:

答案 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之前。