Allgemeine Frage zu Header-Dateien



  • Hallo!

    Als C(++)-Neuling habe ich eine (wohl recht dumme) Frage.

    Folgender Code:

    // square.h
    class Square {	
       public:
          double length;
          Square(double l);
    };
    
    // square.cpp
    #include "square.h"
    
    Square::Square(double l) : length(l) {}
    
    // client.cpp
    #include "square.h"
    
    int main() {	
       Square s(5);
    }
    

    Kompilieren von client.cpp liefert [Linker error] undefined reference to `Square::Square(double)'

    Ich verstehe das jetzt so, dass zwar die Header-Datei Square.h eingebunden wird, aber nirgends ein Bezug hergestellt wird zu Square.cpp und dem Kompiler somit die Implementierung des Konstruktors fehlt.

    Allerdings habe ich Code-Beispiele wie diese schon zigfach gesehen, es wurde immer nur die Header-Datei eingebunden. Was mache ich falsch?

    Danke im Voraus.



  • Wenn du einen Linker-Fehler bekommen hast, dann hast du wahrscheinlich vergessen, die "square.cpp" in dein Projekt mitzukompilieren.

    Außerdem solltest du in jeder Header-Datei einen Include-Guard einsetzen:

    #ifndef FILE_H
    #define FILE_H
    
    ...
    
    #endif
    

    wobei FILE_H ein eindeutiger Name für deinen Header sein sollte.



  • Danke erstmal.

    Projekt? Meine Frage war eher IDE-unabhängig gemeint, kann mir natürlich gut vorstellen, dass es in Visual-C++ o.ä. durchaus funktioniert.

    Aber wie kann ich die Implementierung (im Beispiel: square.cpp) nutzen, ohne die Datei selbst sondern nur den Header einzubinden, rein von der Sprache her gesehen? (mal angenommen, ich habe nur einen Texteditor und den gcc zur Verfügung)

    Gibt es da vielleicht einen Linker-Parameter o.ä.? Oder woher weiß der Compiler einer IDE, dass er die Implementierungen zu den Deklarationen der Header-Datei in square.cpp findet? Namensgleichheit? Setzt die IDE eine implizite "#include square.cpp"-Anweisung?



  • frankie_t schrieb:

    Oder woher weiß der Compiler einer IDE, dass er die Implementierungen zu den Deklarationen der Header-Datei in square.cpp findet? Namensgleichheit? Setzt die IDE eine implizite "#include square.cpp"-Anweisung?

    Der Compiler braucht das nicht zu wissen. Die IDE schickt einfach beide .cpp-Dateien durch den Compiler, und lässt den Linker die Objektdateien zusammenfügen.



  • aha! da hätte ich vielleicht auch drauf kommen können...

    Problem gelöst, danke! 🙂


Anmelden zum Antworten