Probleme mit constanten, header, includier-blalbla
-
Konstanten verhindern, dass sich Header Dateien gegenseitig aufrufen. Ok verwende ich schon länger, nur nicht so wie man es tun soll:
#ifndef header_
#define header_
#include "header.h"
#endifDas währe so mein Weg gewesen. Die Zeilen werden in der Header aufgerufen, in der ich header.h inkludieren will. So sollte man das doch richtig machen:
#ifndef header_
#define header_
[quelltext]
#endif //Zeilen stehen in header.h
Der Aufruf währe dann ganz normal #include "header.h", oder? Bin mir nicht sicher.Denn ich habe folgendes Problem:
main.cpp:
#include <iostream> using namespace std; #include "h1.h" #include "h2.h" int main() { funktion(); system("Pause"); }h1.h:
#ifndef h1_ #define h1_ #include "h2.h" struct hallo { int wert1; int wert2; }; #endifh2.h:
#ifndef h2_ #define h2_ #include "h1.h" void funktion() { hallo ding; ding.wert1=5; ding.wert2=6; cout<<ding.wert1<<endl; cout<<ding.wert2; cout<<endl; } #endifSo die structur die in h1 definiert wurde, sollte in h2 zum einsatz kommen, so leuft das aber nicht durch den Compiler. Grund ist nicht der quelltext selbst sondern der Firlefanz mit den Headern.
Ich versuch die Sache mit dem inkludieren durch zu gehen:
main.cpp-> binde h1 ein
h1.h->mache weiter da kein h1_ definiert wurde
h1.h->definiere h1_
h1.h->inkludiere h2.h
h2.h->mache weiter da kein h2_ definiert wurde
h2.h->definiere h2_
h2.h->inkludiere h1.h
h1.h->gehe zu endif da h1_ definiert wurde
h2.h->lese quelltext bis endif
h1.h->lese quelltext bis endif
mein.cpp->inkludiere h2.h
h2.h->gehe zu endif da h1_ definiert wurde
main.cpp-> der Rest ebenIch geh mal davon aus das es wie sonst in C++ so ist das alles vor der ersten Verwendung deklariert sein muss. Also muss auch die structur deklariert werden, bevor die Funktion definiert wird. Was hier oben nicht der Fall wäre.
So jets meine Frage: 1. Wahr meine Denkweise korrekt?
2. Wie geht man richtig mit dem Problem um?/edit pumuckl: cpp-Tags. Demnächst bitte selber machen!
-
Erstens: Diese Konstruktion nennt sich "Include Guard", falls du nach weiteren Informationen suchen solltest (und die untere Variante ist normalerweise üblich, weil einfacher zu handhaben und sicherer)
Zweitens: Dein Header h1.h ist überhaupt nicht auf die Inhalte von h2.h angewiesen, also braucht er ihn auch nicht einbinden.
(wenn du doch mal in eine Situation kommst, sind Forward-Deklarationen mitunter hilfreich)
Drittens: Wenn du das nächste Mal Quelltext postest, dann bitte in [cpp]-Tags eingeschlossen.
-
Ok danke.
-
Also gut das war jets nur eine Zusammenfassung meines Problems, beide Header haben Abhängigkeiten mit einander. Beide stellen eine Struktur bereit die in der anderen verwendet wird. Allerdings erwartet ein Aufruf nicht nur eine Deklaration sondern eine ganze Definition. Muss man einzelne Elemente einer Struktur nochmal Deklarieren? Denn definieren kann ich die Struktur ja nur ein mal.
-
Lies mal das hier durch. Hilft vielleicht ein wenig mehr fürs Verständnis.
-
Und fürs allgemeine Verständnis schau dir mal wxSkip's Beitrag hiervon an, das sollte ein wenig Licht ins dunkle bringen.
-
Incocnito schrieb:
Und fürs allgemeine Verständnis schau dir mal wxSkip's Beitrag hiervon an, das sollte ein wenig Licht ins dunkle bringen.
Du kannst bei einem Beitrag auf das Papiersymbol oben links klicken, dann erhältst du einen Link, der direkt zum Beitrag führt

-
Ahh, danke!
Ich hab das immer gesucht und nie gefunden. Das ist aber auch gut versteckt..
Ist übrigens ein super Beitrag finde ich
-
Danke! (da hab ich mir ausnahmsweise mal Mühe gegeben)

-
Ales klar. Nur nich Punkt 7.1 der ja wahrscheinlich mein Problem darstellt, könnte ich das nochmal genauer haben, bisher hab ich´s noch nicht verstanden. Und wie ist das mit der Vorwärts Deklaration?
-
Nur um sicherzugehen:
7.1 Membervariablen in Klassen dürfen im Header deklariert sein, da sie beim Ausführen des Programms nicht einfach global auf dem Stack angelegt werden, sondern nur darstellen, wie der Speicher einer Klasse interpretiert werden soll.
Das heißt:class ABC { int x; //die Variablendeklarationen hier dürfen und sollten in den Header string y; public: //... }Das bedeutet, daß der Inhalt einer Klasse ohne Probleme im Header definiert werden kann (und meistens auch muß), ohne damit die One-Definition-Rule zu verletzen.
Zeig doch einfach mal etwas Code, damit wir dir vielleicht eine konkrete Lösung vorschlagen können.
-
BigGreenFoot schrieb:
Ales klar. Nur nich Punkt 7.1 der ja wahrscheinlich mein Problem darstellt, könnte ich das nochmal genauer haben, bisher hab ich´s noch nicht verstanden. Und wie ist das mit der Vorwärts Deklaration?
Ich glaube, dein Problem betrifft eher Punkt 5 und 6...
-
Wie? Man kann alles 1 zu 1 abschreiben? Kein extern davor? Funktioniert das dann auch bei Strukturen?
-
BigGreenFoot schrieb:
Wie? Man kann alles 1 zu 1 abschreiben? Kein extern davor? Funktioniert das dann auch bei Strukturen?
BigGreenFoot.cpp: 1: Fehler: Fehlender Bezugspunkt
-
Es tut mir Leid für meine Engstirnigkeit, ich suche schon seit tagen nach einer Antwort und finde sie nicht. Daher bitte ich um Verständnis. Google ist nur eine Maschine, ein Mensch (kann) einem entgegen kommen. Die Sache mit den Headern hab ich glaub einigermaßen verstanden. Ich bräuchte bitte nur noch ein Beispiel von einem Quelltext, in dem eine Struktur in zwei Headern eingesetzt wird, damit ich mir mal ein Bild machen kann.
-
BigGreenFoot schrieb:
Es tut mir Leid für meine Engstirnigkeit, ich suche schon seit tagen nach einer Antwort und finde sie nicht. Daher bitte ich um Verständnis. Google ist nur eine Maschine, ein Mensch (kann) einem entgegen kommen. Die Sache mit den Headern hab ich glaub einigermaßen verstanden. Ich bräuchte bitte nur noch ein Beispiel von einem Quelltext, in dem eine Struktur in zwei Headern eingesetzt wird, damit ich mir mal ein Bild machen kann.
Mein Kommentar sollte nicht heißen, dass du mir auf den Nerv gehst. Ich wollte damit nur ausdrücken, dass ich deine Frage absolut nicht verstanden habe.
Leider weiß ich nicht so genau, was du brauchst...
A.h
#ifndef A_H #define A_H class A { //... }; #endif //A_HB.h
#ifndef B_H #define B_H #include "A.h" class B : public A { //... }; #endif //B_HC.h
#ifndef C_H #define C_H #include "A.h" class C : public A { //... }; #endif //C_HAlso: Du kannst die Struktur in einen dritten Header auslagern. Oder aber du bindest den einen Header in den anderen ein. Du kannst schauen, ob eine Vorwärtsdeklaration ausreicht. Letztendlich hängt die "optimale" Headerstruktur immer von dem ab, was du machst.
-
Ok das war schlecht formuliert, ich bräuchte einen Beispiel Quelltext, in dem 2 Header ihre eigene Struktur haben, die in der jeweils anderen eingesetzt wird. Was bedeutet das man eins der Strukturen 2x definieren/deklarieren muss.
Am besten zeig ich euch mein naja „Ding“ (Quelltext), mit dem ich das Problem habe (unter anderem) . Ich stell ihn als Download bereit, den zum anzeigen wäre es zu fiel. Bitte schaut euch das „Ding“ für mich durch, und nörgelt so fiel ihr könnt, damit ich weiß wie/was ich besser machen soll. Das „Ding“ sollte ein Brainfuck Interpreter werden. Allerdings ohne STL, mit einem Haufen Rechtschreibfehler, und noch mehr Speicherlecks.Probleme hab ich gerade bei Parser.h, und loop.h, beide haben eine Struktur, die bei der jeweils anderen eingesetzt wird. jump_save soll den letzten Rücksprungpunkt speichern, und sign_posi, die Position des Parserzeigers in einem String.
https://sites.google.com/site/csbackround/downloads/BraynFuck.zip?attredirects=0&d=1
-
Man packt ja auch normalerweise keine Funktionsdefinitionen in die Header (außer inline-Funktionen), sondern in den CPP-Dateien. Und für die Funktionsprototypen reicht eine Forward-Deklaration der benötigten Typen aus.
-
Also guckst du nach Punkt 2 und 5. Und wieso inkludierst du <string>, wenn du ohne STL arbeiten willst?
-
Komplet alle Funktionen in die .cpp auch bei Klassen?