Headerstrukturierung
-
Morgen,
ich habe den Code ausgelagert (in headerfiles) die ich im hauptprogramm wieder includieren möchte. Dabei gibt es ein Problem:
// Vorwärtsdeklarationen und globale Variablen char *gLogfiles = "Unbekannt"; void Add_Logfile(); // Eigene Includes #include "format.h" #include "errlog.h" #include "menu.h"
Da in menu.cpp und format.cpp gLogfiles genutzt wird und die funktion Add_Logfile aufgerufen wird, habe ich diese vor den eigenen Includes gesetzt damit es gehen müsste. Es funktioniert aber nicht
Der Aufbau sieht wie folgt aus:Header
#ifndef __format_h__ #define __format_h__ #include <iostream> using namespace std; // vorwärtsdeklarationen #endif
File
#include "format.h" // funktionen
Die .h wird dann im Hauptprogramm includiert. Aber wie gesagt *gLogfiles und
Add_Logfile() kennt er nicht in den cpp's zu den header-dateien.
-
sind die Vorwärtsdeklarationen jetzt im Header oder nicht
btw. musst du extern explizit bei Variablen angeben, wenn du diese Vorwärtsdeklarieren willst.
Dann ist es nicht sehr fein in einem Header einen Namespace zu öffnen!
Und __ sind dem Compiler vorbehalten (siehe FAQ)
-
Erstmal danke für die Antwort:
// Vorwärtsdeklarationen und globale Variablen
char *gLogfiles = "Unbekannt";
void Add_Logfile();Das steht im mainfile, darunter meiner header. in den headern stehen die prototypen, vorwärtsdeklarationen oder auch funktionsköpfe der funktionen im zugehörigen cpp file.
Ich hoffe das war klarer
wie mache ich das mit dem extern?
-
Ok machen wir es noch einfacher:
Es gibt eine globale Variable die in den headerdateien genutzt wird und dort nicht erkannt wird, obwohl ich sie vorher deklariere:
bool global;
#include "bla.h" // global unbekannt
-
Ok ich habe ein wenig rumgespielt und die globale variable einfach noch mal in den einzelnen headerfiles als extern deklariert. Allerdings habe ich dazu eine Frage:
bewirkt das extern das die globale variable erkannt und verwendet wird? Sprich die extern variable ist gar keine eigene variable mit der weiter gearbeitet wird?
-
Eine extern-Deklaration ist nur ein Verweis auf eine irgendwo anders existierende Variable, der spätestens vom Linker aufgelöst wird. Also ja.
-
Und bist du noch so nett und erklärst mir wie ich die namespaces in den .h vermeide? die __ und _ wurden schon entfernt
-
du sollst die namespaces nur nicht global öffnen (also kein using nehmen)
-
Hm du meinst nur "namespace std;"? das mag der compiler nicht "Syntaxfehler : ';'" ?
-
Nein einfach immer brav "std::", bzw. privat in einem Scope und nicht im globalen Scope "using namespace std;" schreiben.
MfG SideWinder
-
Ok erledigt aber ich will ehrlich sein, was ist so schlecht daran einfach die namensräume zu öffnen? Wäre nett wenn ihr mir das erklärt ich weiß es nicht und würde es gerne wissen
-
Printkey schrieb:
Ok erledigt aber ich will ehrlich sein, was ist so schlecht daran einfach die namensräume zu öffnen? Wäre nett wenn ihr mir das erklärt ich weiß es nicht und würde es gerne wissen
Garnix.
Aber wenn du das in einer Header Datei machst, dann ist der Namensraum auch in allen Dateien offen, die diese Header #includen.Das kann natürlich zu komischen Fehlern führen - weil du damit ja das ganze Namespace-Konzept aushebelst.
Lokal ist das ja OK - weil du genau weisst, welche Funktionen etc. du deklariert hast - aber das kannst du ja für fremden Code nicht wissen.
-
ahh ok vielen dank