globale Variable



  • 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


Anmelden zum Antworten