Unterschied zwischen global und extern ?



  • Hallo
    also mein problem ist, ich versteh den sinn von extern nicht recht..
    es gibt doch auch globale variablen...
    wieso kann man globale vars, nicht auch in mehreren anderen dateien benutzen, insofern sie darin einebunden sind?
    extern jedoch schon ( kann man extern auch dann noch benutzen wenn die dateien nicht eingebunden sind ?)

    bitte um ausführliche und verständliche hilfestellung! 😉

    thx & mfg!!



  • Hallo

    der Unterschied : global Variablen werden pro Übersrtzungseinheit jeweils einmal angelegt. Bei extern hingegen wird nur eine Variable im ganzen Programm angelegt. Das bedeutet du kannst mit extern Werte zwischen einzelnen Übersetzungseinheiten austauschen, mit einfachen globalen Variablen nicht.

    bis bald
    akari





  • k thx hab s jetzt besser verstanden.
    nur etwas bleibt bei mir offen:

    @Erhard Henkes:
    wieso hast du in dem Namespace My die Var Pi als extern deklariert??
    stdafx.h ist ja sowieso in die cpp eingebunden, un mit ihr der namespace in dem pi ist, also bräuchte man das extern hier ja gar nicht oder?
    im namspace std; sind die vars und funktionen ja auch nicht als ext. deklariert (glaub ich zumindesr) 😉

    kann man globale vars auch nicht in anderen dateien benutzen, wenn sie durch ein include eingebunden werden?

    thx & mfg!!



  • Du beschäftigst Dich wenige Minuten mit diesem Thema und gackerst hier anschließend wieder herum? 😃



  • Die Erklärung von akari ist so nicht ganz richtig:

    Erst einmal unterscheidet man zwischen Programmglobalen und Modulglobalen Variablen.
    Modulglobale Variablen werden in einer cpp außerhalb jeder funktion definiert wie Programmglobale Variablen, nur dass man hier das Schlüsselwort static voranstellt. Das ist aber starkes C. In C++ verwendet man da einfach namenslose namespaces. Eine Modulglobale Variable darf pro Modul nur einmal definiert und beliebig oft deklariert werden.
    Programmglobale Variablen werden Außerhalb jeder Funktion aber ohne das Schlüsselwort static definiert. Diese Variable ist im gesamten Programm sichtbar und darf nur einmal definiert werden jedoch auch beliebig oft deklariert.
    Das mit dem extern hat folgendes auf sich:
    eine lokale Variable die ohne gleichzeitige initialisierung eingeführt wird ist KEINE gleichzeitige Definition. Eine globale variable ohne gleichzeitige Initialisierung wird automatisch mit 0 initialisiert und stellt somit eine Definition dar. Will man jetzt eine Programmglobale Variable, die in Modul A DEFINIERT wurde auch in Modul B verwenden, dann muss man sie dort DEKLARIEREN.
    Und hier kommt das Schlüsselwort extern ins Spiel. Es sagt aus das eine Globale Variable nur deklariert werden soll, also nicht definiert wird. Würde man in Modul B das schlüsselwort extern vergessen, so wäre das eine Neueefinition also ein Fehler.



  • thx tomtom deine erklärung hat mir sehr geholfen! 🙂
    aber wenn mna die variable extern deklariert, kann man sie doch in mehreren dateien benutzen oder nicht, nicht nur wie in deinem beispiel in modul a und modul b oder wie?
    ich probioer gerade n kleines direct x prog zu schreiben. die extern variablen musste ich alle nur 1 mal als extern deklarieren, und kann sie in allen moduklen benutzen. eine extern variable allerdings blcojkt, und zwar der
    LPDIRECT3DDEVICE9 Zeiger auf die schnittstelle...
    wenn ich den dann in anderen dateien auch als extern deklariere läuft der zieger da auch...
    weshalb muss ich den zeiger aber mehrmals deklarieren??

    thx & mfg! 👍



  • JossBoss schrieb:

    thx tomtom deine erklärung hat mir sehr geholfen! 🙂
    aber wenn mna die variable extern deklariert, kann man sie doch in mehreren dateien benutzen oder nicht, nicht nur wie in deinem beispiel in modul a und modul b oder wie?

    Hallo,
    Allgemein lässt sich sagen: Wenn du eine globale Variable foo vom Typ T, die du im Modul "a" definiert hast, in den Modulen b, c, d, ..., z benutzen möchtest, musst du in diesen jeweils ein

    extern T foo;
    

    vor der ersten Benutzung derselben schreiben.

    edit:
    Meistens macht man es dann allerdings so (insbesondere bei mehreren globalen Variablen), dass man die globale(n) Variable(n) in irgendeinem Modul definiert und desweiteren einen Header (z.B. my_global_vars.hpp) verwendet, in welchen man

    extern T foo;
    

    schreibt. Diesen Header bindet man nun über #include "my_global_vars.hpp" in jedem Modul ein, welches die globale Variable foo benutzen soll.

    Gruß, Caipi.



  • thx jeztt hab ichs noch besser geschnallt ;-),
    nur noch etwas, haben die foo's dann immer in jedem modul den gleichen wert ja oder? den von der letzten definition wenn ich das recht verstehe.

    thx & mfg! 👍 👍



  • Hallo,

    JossBoss schrieb:

    nur noch etwas, haben die foo's dann immer in jedem modul den gleichen wert ja oder? den von der letzten definition wenn ich das recht verstehe.

    Du kannst nicht sagen, "die foo's". Es handelt sich hierbei ja immer um die _gleiche_ globale Variable foo. Sie enthält genau den Wert, den du ihr _zuletzt_ zugewiesen hast, egal von welchem Modul aus du dies getan hast. (Das Schlüsselwort const mal außen vorgelassen).

    Gruß, Caipi


Log in to reply