2016-05-03 6 views
1

今、私はシステムプログラミングに関するコースのプロジェクトに取り組んでいます。私たちは、RealtorsとCustomersと一緒にアパートを売るプラットフォームをプログラムするように求められました。私はEclipseで作業しています。ヘッダーファイルが異なるヘッダーファイルからtypedefを認識しない

これまでのような問題は発生しませんでしたが、私のヘッダーファイルの1つでは、2番目のヘッダーファイルの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; 

これにより、第2のヘッダファイルであるが、

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' "です。同じ関数が "apartment_service.h"の 'ApartmentService'のような他のtypedefを使用するので、これは本当に奇妙です。

+1

ヘッダーに円形の包含があるため、一部のガードが欠けています。これらの警備員は、これらの最初のエラーを撃墜するだけですか? – ckruczek

+1

これに追加するには:ガードがあっても、 'Customer.h'に' Customer 'を含む 'Realtor.h'が含まれています。これは(おそらく守られている) 'Realtor.h 'を含んでいます。インクルードガードなしでは、これは全く機能しません。インクルージョンガードを使用すると、 'Realtor.h'の2番目のインクルードが終了し、' Realtor.h'の宣言なしで 'Customer.h'で終わることになります。 – dhke

答えて

2

Realtor.hにCustomer.hを含めています。

ここでエラーが発生しています。 Realtor.hでは、RealtorのtypedefはCustomer.hの前に定義されていません

Realtor.hからCustomer.hを削除します。それは与えられたコードの問題を解決するはずです。

+0

残念ながら、これは役に立たなかった。多分もっと多くのアイデアは? ありがとう! –

0

あなたは単にこれを行うべきではありません。これらのインクルードファイルは、インクルードファイルではなくコードファイルに含める必要があります。

ヘッダーファイルにtypedef struct customer_t* Customer;というような宣言があるのは問題ありません。あなたは、何らかの型へのポインタを定義しているときに、何かを知るための宣言は必要ありません。つまり、コンパイラはすべてのプロトタイプを知る必要があります。

EDIT

各モジュールは、それが利用可能にするものエクスポートする必要があり、全体では「ビルドアップ」する必要がありそう何の循環依存関係は、好ましくありません。したがって、アパートメントは、例えばベースの「クラス」であり、アパートメントサービスはアパートメントを使用する。顧客はベース「クラス」であり、お客様のプログラムには、お客様がアパートメントを購入するための機能があります。ときどきサーキュラー参照や前方参照を防ぐことはできません。その場合、インクルードファイルの内容が1回だけ含まれるようにするために "インクルードガード"を使用してください。

/* 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は、顧客モジュールの一部である必要があり、その結果、モジュールが含む必要はないことを疑いますアパートまたは不動産業者;むしろ、オファーをするのは不動産業者です。私はあなたのインクルードがランダムな順序で少し見えることにも注意します。とにかく、インクルードガードを使用すると循環インクルードを防ぐことができ、元の問題を解決するはずです。これが少し助けてくれることを願っています

+0

私はどのように私の.hファイルの関数宣言を行う必要がありますか?例えば、私がそこで宣言しようとしている関数は、ApartmentService.hのApartmentServiceとRealtor.hのRealtorを利用しています。私がそれらを私の.hに含めるのでなければ、それらを関数宣言でどのように使うことができますか?どうもありがとう! –

関連する問題