Anfängerfrage zum Inkludieren.



  • Hi,

    also jetzt kommt mal eine ziemliche Anfängerfrage.

    Ich lese mir gerade ein Quelltext durch in dem es 3 Dateien gibt:
    1: programm.cpp
    2: struktur.h
    3: struktur.cpp

    Also in "programm.cpp" ist das eigentliche Programm, in "struktur.h" ist eine Klasse deklariert und in "struktur.cpp" sind die einzelnen Funktionen der Klasse geschrieben worden.

    In den Dateien "programm.cpp" und "struktur.cpp" wird die Header-Datei "struktur.h" inkludiert:

    ...
    #include "struktur.h"
    ...
    

    Soweit so gut.
    Jetzt wird aber dem Compiler ja nur die Datei "programm.cpp" übergeben, in welche dann "struktur.h" durch include eingefügt wird.

    Meine Frage ist: Wie kommt der Compiler jetzt an die Funktionen aus "struktur.cpp" ran, wenn diese doch niergends in "programm.cpp" oder "struktur.h" inkludiert wurde???
    Oder habe ich da irgendwo etwas übersehen???
    😕 😕 😕

    Wolle.



  • An die Quellcodedatei kommt der Compiler jederzeit dran, er schaut aber ohne Weiteres nicht rein
    Jetzt sind da aber die Prototypen der Funktionen in der Klassendeklaration und dann denkt der: Aha, mal sehen, wo ich die Definition finde.
    In die Quellcodedatei marschiert der dann ohne Anfrage ein und erspäht die Definition und versklavt sie dann, um sie künftig zu nutzen.

    So geht das da ab. 🙂



  • Aha, ok erstmal danke für die Antwort.
    D. h. die Datei "struktur.cpp" muss deshalb nicht inkludiert werden weil der Compiler selbst nachschaut.
    Aber gibt es da irgendwelche Bedingungen dafür??? Müssen die Header- und Quelldatei gleich benannt sein???



  • Nein, der Compiler durchsucht bei Finden eines Prototyps automatisch alle Quellcodedateien, wobei der da noch mehr tricks auf Lager hat, aber das ist compilerabhängig. 😉



  • Was wäre dann aber wenn ich die selbe struktur in verschiedenen Versionen in verschiedenen Dateien im selben Ordner habe???
    Würde das eine Fehlermeldung produzieren oder nimmt er das was er als erstes findet???



  • Der Compiler muß schon beide .cpp - Dateien übersetzen.
    jede Datei wird einzeln übersetzt, der Linker schmeißt das Ergebnis dann zusammen.

    Der Header sagt dem Compiler nur "irgendwo gibt es eine Klasse soundso mit dieser und jener Methode". Wenn der Compiler jetzt programm.cpp durchnuddelt, merkt er sich nur "hier CStruktur::Fandango() aufrufen". Erst der Linker schaut nach ob es irgendwo CStruktur::Fandango gibt (compilierte Object-Dateien der Quellen, oder Libs)



  • Wolle. schrieb:

    Müssen die Header- und Quelldatei gleich benannt sein???

    Unabhängig davon was Dein Compiler/ Linker macht würde ich Dir das auf alle Fälle raten.



  • @Peterchen:
    Du meinst also das ich dem Compiler "programm.cpp" und "struktur.cpp" zur übersetzung geben muss und der Linker schmeisst das dann entsprechend zusammen???

    @nman:
    Auf jeden fall scheint es so üblich zu sein das Header- und Quelldatei gleich benannt sind, aber wie schaut es da bei den meisten Compilern aus, brauchen die das oder nicht???



  • völlig wurscht



  • Ja.

    Die Namen sind Wurst, der Linker sucht sich's aus allen "Anbietern" zusammen.



  • Ok, jetzt ist eigentlich alles klar.

    Danke an alle für die schnelle Hilfe und einen guten Rutsch ins nächste Jahr!


Anmelden zum Antworten