globale Variable



  • Hallo,

    mein projekt besteht aus 4 Dateien. dat1.c, dat2.c,dat3.c,dat4.c

    Im modul dat1.c definiere ich eine globale Variable int global;

    können die anderen 3 dateien jetzt auch auf sie zugreifen ?



  • Ja.

    Du musst nur eine Header Datei in allen .c Dateien einbinden und dort die Variable bekanntmachen:

    extern int global;
    


  • In eine Header Datei:
    extern typ bezeichner;

    In eine Source Datei:
    typ bezeichner;

    Überall wo du die Variable nutzen willst:
    #include "header"

    Ist allerdings schlechter Stil.



  • schade dass man die headerdatei jeweils in allen 4 dateien einbinden muss.
    Wäre schöner der compiler würde alle header module selbst durchsuchen.



  • blurry333 schrieb:

    schade dass man die headerdatei jeweils in allen 4 dateien einbinden muss.
    Wäre schöner der compiler würde alle header module selbst durchsuchen.

    Ne, waere garnicht schoen. Dann waeren die Kompilierzeiten so hoch dass man keinen Spass mehr haette.

    Das Modulsystem von C++ ist leider etwas betagt 😕

    Deshalb hat man fuer sowas ja eine precompiled Headerdatei in der die am meissten verwendetsten Deklarationen stehen.



  • ich packe meine Klasse Test in eine header Datei mit namen datei.h
    Die Implementierung der klasse findet in der datei mit namen datei.c statt.

    Dazu gibt es die Datei uebung.c in der auch die main ist.
    IN der datei uebung.c brauche ich nur die header datei datei.h einbinden.

    Meine Frage.

    woher weißt der compiler wo die IMplementierung stattgefunden hat ?
    ER weiß ja eigentlich nicht dass sie in der datei.c ist . er muss praktisch
    alle quelledateien durchsuchen um sie zu finden.



  • Ne kurze Frage dazu,
    kann man nicht in jede Source-Datei einfach "extern typ bezeichner" schreiben?
    Header-Datei wär zwar einfacher, aber frage rein aus verständnistechnischen Gründen 😉

    Gruß freeG



  • Ja, kannst du.

    Gruß



  • ok dankeschön 🙂



  • blurry333 schrieb:

    woher weißt der compiler wo die IMplementierung stattgefunden hat ?

    Das macht er ganz faul. Er nimmt einfach an, dass du alles korrekt implementiert hast.

    Wenn er nun eine .cpp Datei kompiliert, dann macht er folgendes:
    er parst die Datei und alle in ihr eingebundenen Header Dateien und erstellt dann eine neue Datei (meistens .o oder .obj). In dieser ist ein Inhaltsverzeichnis der Funktionen drinnen.

    Wenn man nun ein paar soleche .o Dateien hat, ruft man den Linker auf. Der Linker verknuepft die .o Dateien zu einer Ausfuehrbaren Datei (zB .exe). Dabei liest er alle Inhaltsverzeichnisse. Wenn nun eine Funktion in einer .o Datei aufgerufen wird die nicht in dieser .o Datei definiert ist erkennt das der Linker und durchsucht die Inhaltsverzeichnisse.

    Wenn du zB folgenden Code kompilierst:

    int main() {
      ich_bin_ein_fehler();
    }
    

    wirst du keinen Compilerfehler sondern einen Linkerfehler bekommen.



  • blurry333 schrieb:

    woher weißt der compiler wo die IMplementierung stattgefunden hat ?
    ER weiß ja eigentlich nicht dass sie in der datei.c ist.

    Das muss er nicht wissen. Er kann Code generieren, wo Funktionsaufrufe von Funktionen drinstehen, deren Definitionen unbekannt sind. Dafür gibt es dann "Platzhalter". Der Linker verknotet das dann später schon richtig.

    Das Konzept nennt sich "getrennte Übersetzung" und sollte eines der ersten Dinge sein, die man aus einem guten C oder C++ Buch lernt.

    kk



  • aha. Wie kann man denn eine Datei getrennt übersetzen.
    Wenn ich im Visual Studio auf Projekt erstellen gehe , dann wird das
    ganze projekt übersetzt und nicht nur eine datei



  • Dafür gibt es dann "Platzhalter". Der Linker verknotet das dann später schon richtig.

    Letztendlich muss er dann trotzdem in jede .c datei reinschaun ob
    dort die Funktion oder die Klassen Methoden definiert sind.
    Andere Möglichkeit gibts ja nicht. Es werden ja immer die .h dateien
    eingebunden. Und dort ist kein Verweis auf die IMplementierungsdatei sprich
    .c datei drin .



  • blurry333 schrieb:

    Letztendlich muss er dann trotzdem in jede .c datei reinschaun ob

    Nein, siehe meinen Beitrag.



  • jetzt versteh ich auch die Bedeutung von folgendem

    datei.h
    
    extern int x
    

    mit dem extern zwinge ich den programmierer in irgendeiner
    anderen Datei diese Variable x zu definieren. Ich will praktisch
    dass es eine variable mit diesem namen gibt. Anderen grund seh ich nicht.



  • ja der compiler erstellt ein Inhaltsverzeichnis. Aber der linker
    muss alle Inhaltsverzeichnisse durchschauen. Ist ja auch nichts anderes.



  • weiß niemand wie man eine einzelne datei kompiliert und nicht
    das ganze Projekt ?



  • blurry333 schrieb:

    weiß niemand wie man eine einzelne datei kompiliert und nicht
    das ganze Projekt ?

    Klar

    g++ -c soundso.cpp
    

    (Mit dem Microsoft-Compiler geht das sicherlich ähnlich)

    Aber es ist ja gerade der Witz an einer guten IDE, dass diese Dir diesbezgl einiges an Arbeit abnimmt und automatisch nur das neu kompiliert, was neu kompiliert werden muss.

    Du solltest mal den Microsoft-Compiler in der Kommandozeile bedienen und das mal Schritt für Schritt nachmachen ... also cpp --> Objekt-Datei --> EXE. Soweit ich weiß, ist heißt der Compiler cl.exe . Ich kenn die Optionen da aber nicht für... RTFM! :p



  • blurry333 schrieb:

    weiß niemand wie man eine einzelne datei kompiliert und nicht
    das ganze Projekt ?

    Ctrl-F7


Log in to reply