2016-05-03 8 views
1

Momentan arbeite ich an einem Projekt für meinen Kurs zur Systemprogrammierung. Wir wurden gebeten, eine Wohnung Verkaufsplattform mit Realtors und Kunden zu programmieren. Ich arbeite an Eclipse.Header-Datei erkennt nicht typedef aus einer anderen Header-Datei

Nun, obwohl ich keine Probleme wie diese in der Vergangenheit hatte, eine meiner Header-Dateien erkennt einen Typedef aus einer zweiten Header-Datei nicht.

Erläuterung: Hier sind meine Dateien;

Realtor.h

#include "apartment.h" 
#include "apartment_service.h" 
#include "Report.h" 
#include "Customer.h" 
#include "mtm_ex2.h" 


typedef struct realtor_t* Realtor; 

Zwar ist dies die zweite Header-Datei;

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); 

(die structs von CUSTOMER_T und realtor_t in den Quelldateien definiert sind)

Aus irgendeinem Grund geben die Funktionsdeklarationen in Customer.h mir die folgende Fehlermeldung: " unbekannter Typname 'Grundstücksmakler' ". Das ist wirklich seltsam, weil die gleichen Funktionen andere Typdefinitionen wie 'ApartmentService' von 'apartment_service.h' verwenden.

+1

Ich vermisse einige Include-Wachen, weil Sie zirkuläre Aufnahme in Ihrer Kopfzeile haben. Haben Sie diese Wachen, nur um diese ersten Fehler zu erschießen? – ckruczek

+1

Hinzuzufügen: Selbst mit Wächtern enthält 'Customer.h'' Realtor.h', die 'Customer enthält.h', die (wahrscheinlich bewacht) 'Realtor.h' enthält. Ohne Wächter funktioniert das überhaupt nicht. Mit include guards geht das zweite Include von 'Realtor.h' einfach durch und Sie landen in' Customer.h' ohne die Deklaration von 'Realtor.h' (weil Sie gerade genau dieses Include verarbeiten). – dhke

Antwort

2

Sie binden Customer.h in Realtor.h ein.

Hier tritt der Fehler auf. In Realtor.h ist der typedef für Realtor nicht definiert, bevor Customer.h

Entfernen Sie die Aufnahme von Customer.h von Realtor.h. Das sollte das Problem für den angegebenen Code lösen.

+0

Leider hat das nicht geholfen. Vielleicht noch mehr Ideen? Vielen Dank! –

0

Sie sollten dies einfach nicht tun. Sie sollten diese Include-Dateien in Ihre Code-Dateien aufnehmen, nicht Ihre Include-Dateien.

Deklarationen wie typedef struct customer_t* Customer; in Ihren Header-Dateien ist in Ordnung. Sie brauchen eine solche Deklaration nicht, um mehr zu wissen, da Sie einen Zeiger auf einen Typ definieren. Das ist alles, was der Compiler für die Prototypen, die Sie geben, wissen muss.

EDIT

Jedes Modul nur exportieren sollte, was sie zur Verfügung stellt und „Aufbau“ die Gesamt sollte so gibt es vorzugsweise keine zirkulären Abhängigkeiten. So ist Apartment zum Beispiel eine Basis "Klasse", Apartment Services nutzt Apartment; Kunde ist eine Basis "Klasse", und Ihr Programm hat Funktionen für einen Kunden, ein Apartment zu kaufen. Manchmal können Zirkularreferenzen oder Vorwärtsreferenzen nicht verhindert werden. In diesem Fall sollten Sie "include guards" verwenden, die sicherstellen, dass der Inhalt einer Include-Datei nur einmal enthalten ist.

/* 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*/ 

einen guten Blick auf, wer darüber wissen muss, was zu Ihrer Include-Struktur vereinfachen kann, zum Beispiel, ich bezweifle, dass makeOffer sollte einen Teil der Kunden-Modul und als Ergebnis sein muß das Modul nicht enthält Wohnung oder Makler; Vielmehr ist es der Immobilienmakler, der das Angebot macht. Ich bemerke auch, dass Ihre Includes ein bisschen in zufälliger Reihenfolge erscheinen. Wie auch immer, die Verwendung der Include-Wächter kann zirkuläre Includes verhindern und sollte Ihr ursprüngliches Problem lösen. Ich hoffe, das hilft ein bisschen.

+0

Also wie soll ich Funktion Deklarationen in meiner .h-Datei tun? Zum Beispiel verwendet die Funktion, die ich dort deklarieren möchte, ApartmentService von ApartmentService.h und Realtor von Realtor.h. Wenn ich sie nicht in meine .h-Datei einfüge, wie kann ich sie dann in meiner Funktionsdeklaration verwenden? Danke vielmals! –

Verwandte Themen