Verwendung von "extern"



  • Den Zusatz "extern" braucht der Compiler für fremde Deklarationen, die dann der Linker aufzulösen hat. Also immer dann, wenn mehrere Programm-Objekte vorliegen. Mit Klassen hat das direkt nicht szu tun.



  • Danke schon mal für die Antworten.
    Dann hab ich möglicherweise mit extern nicht das richtige...
    Also um es zu genauer zu beschreiben was ich brauche:
    Ich habe ein Projekt mit mehreren Header und Source Dateien. Nun möchte ich mehrere Variablen im gesamten Projekt verwenden. Wie kann ich eine solche Variable definieren.
    danke schon mal



  • Eine Möglichkeit wäre ein Singleton.
    Oder willst Du mehrere PODs über das ganze Projekt hinweg verwenden? Dann würde ein Config-Objekt als Singleton in Frage kommen.



  • Du meinst also globale Variablen. Doch, hierbei kannst du extern schon brauchen. Nehmen wir an, die Variable, die du in mehreren Dateien benötigst, heisse GlobalVar .

    Jetzt schreibst du in einem Header (z.B. "Global.h"), den du an den gewünschten Stellen einbindest:

    extern int GlobalVar;
    

    Das war nur eine Deklaration der globalen Variable. Um sie zu verwenden, muss sie definiert werden, d.h. ihr muss Speicherplatz bereitgestellt werden. Das erledigst du in der Implementationsdatei (z.B. "Global.cpp"), in der du den Header einbindest:

    int GlobalVar = 2;
    

    Von globalen Variablen ist aber aus jenem Grund eher abzuraten.

    Airdamn schrieb:

    Eine Möglichkeit wäre ein Singleton.

    Naja, kommt drauf an. Singletons sind eigentlich nicht unbedingt ein Ersatz für globale Variablen, sondern verhinden Mehrfachinstanzierung.



  • Bei der Aufteilung eines Projektes auf mehrere Source-Dateien sind globale Daten durchaus sinnvoll, sonst muss man die Informationen über Funktions-Parameter austauschen. Also zwei Header-Dateien global.h und globalx.h, einmal ohne und einmal mit extern. Das ist alles!



  • Ich dank euch für die Hilfe. werd das ganze mal so probieren.
    schönen Gruß
    Michael



  • berniebutt schrieb:

    Bei der Aufteilung eines Projektes auf mehrere Source-Dateien sind globale Daten durchaus sinnvoll, sonst muss man die Informationen über Funktions-Parameter austauschen.

    Okay, dann lies bitte mal den von mir verlinkten Thread. Da wird nämlich genau auf diese Problematik angesprochen. Bequemlichkeit führt in diesem Falle eher zu Problemen (auch wenns bei kleinen Projekten noch gut gehen kann, sollte man es sich nicht angewöhnen).

    berniebutt schrieb:

    Also zwei Header-Dateien global.h und globalx.h, einmal ohne und einmal mit extern. Das ist alles!

    Nein, nicht zwei Headerdateien, sondern eine Implementierungs- (.cpp) und eine Headerdatei (.h/.hpp).



  • Ok ich hab das jetz mal so versucht und folgenden Fehler in der Zeile wo extern steht erhalten : "Storage class specified for dield 'GlobalVar'"
    Der Code sieht folgendermaßen aus:
    global.h:

    #ifndef GLOBAL_H
    #define GLOBAL_H
    
    #include <QObject>
    
    class Global : public QObject
    {
        Q_OBJECT
    
    public:
        Global();
        ~Global();
        extern int GlobalVar;
    private:
    
    };
    
    #endif // GLOBAL_H
    

    global.cpp

    #include "global.h"
    
    Global::Global()
    
    {
    int GlobalVar=2;
    }
    
    Global::~Global()
    {
    
    }
    

    Irgendwie Blick ich da scheinbar was nicht 😞



  • Ah, da hast du etwas falsch verstanden. Das extern benötigst du, wenn GlobalVar wirklich eine globale Variable wäre und in mehreren Dateien eingebunden wird - bei dir ist GlobalVar ein Klassenmember 😉

    Klassenmember initialisiert man mit dem Konstruktor und der Konstruktorliste (wobei dann jede Instanz solch ein Objekt besitzt):

    class Global
    {
        Global();
        int MemberVar;
    };
    
    Global::Global()
    : MemberVar(2)
    {
    }
    

    Vielleicht willst du aber, dass das Objekt nur einmal existiert. Dann wären statische Variablen angebracht (die bis zum Ende des Programms existieren):

    class Global
    {
        static int StaticVar;
    };
    
    int Global::StaticVar = 2;   // Definition ausserhalb der Klasse
    // auch Möglich, ohne Initialisierung:
    int Global::StaticVar;
    


  • Bin ja totaler Anfänger in C++, hab zuvor eigentlich nur ein bisschen Java programmiert. JEtzt hab ichs hinbekommen und muss mir im nachhinein auf den Kopf greifen warum ich nicht früher drauf gekommen bin.
    Hab nochmal das Buch "C++ von A-Z" aufgeschlagen und das Kapitel mit Funktionsaurufe gelesen und bin dann auf "call-by-reference" gestoßen mit dem mein Problem schlagartig gelöst wurde!
    Danke trotzdem für eure Geduld und Hinweise!
    schönen Gruß
    Michael


Anmelden zum Antworten