Mehrfachdeklaration bei #include



  • Da ich vor kurzem erst auf C++ umgestiegen bin, stehe ich gerade vor einem kleinem Problem.

    Ich habe in meinem Projekt vier Dateien:
    - Matrix.h und Verlet.h enthalten Structs, die in
    - Matrix.cpp und Verlet.cpp gebraucht werden. Die .cpps enthalten einige Funktionen und inkludieren (Unwort des Jahres) jeweils ihre zugehörigen Header.

    Da die Hauptdatei Verlet.cpp die Funktionen der Matrix.cpp benötigt, steht am Anfang der Verlet.cpp logischerweise ein #include "Matrix.cpp"

    Versuche ich nun aber das ganze zu kompilieren, steht im BuildLog, dass jede Funktion der Matrix.cpp bereits in Matrix.obj definiert sei und bricht den Vorgang wegen doppelt definierten Symbolen ab.
    Wenn ich den Inhalt von Matrix.cpp in Verlet.cpp kopiere und kein #include benutze, funktioniert es fehlerfrei.
    Woran genau liegt das? Habe ich die Funktionsweise von #include falsch verstanden?
    Ich benutze Visual C++ 2008 Express Edition.



  • Google mal nach include guards



  • Soweit ich das verstehe, scheint das nicht mein Problem zu sein.
    Da der Code im Moment noch relativ klein ist und ich alles durchgegangen bin, bin ich mir ziemlich sicher, dass jeder Header und jede .cpp nur einmal eingebunden wird.
    Auch ein testweises #pragma once hat nichts gebracht.



  • Noobody schrieb:

    Da die Hauptdatei Verlet.cpp die Funktionen der Matrix.cpp benötigt, steht am Anfang der Verlet.cpp logischerweise ein #include "Matrix.cpp"

    Dazu benötigst Du nur den matrix.h Header! Und nicht die ganze CPP! Das macht docj keinen Sinn.

    Du benötigst die Deklaration (in der .h Datei) einer Funktion um sie zu verwenden. Nicht die Definition (in der .cpp Datei)!



  • Du hast da was falsch verstanden. In C++ werden nur die Header (.h , .hpp) eingebunden. Die .cpp's musst du nur mitlinken. (automatisch durch die IDE, oder per makefile).

    Also du hast es dann in etwa so stehen:

    matrix.hpp

    //includeguards 
    class matrix{}
    

    matrix.cpp

    #include "matrix.hpp"
    matrix::matrix (){...}
    

    Das gleiche machst du mit allen anderen hpp's und cpp's.
    Die Includeguards brauchst du, wenn du in der gleichen Übersetzungseinheit einen Header 2 mal inkludierst. Sprich in matrix.cpp und vlt. in Game.cpp., wobei in Game.cpp du SpielObjekt.hpp inkludierst, welches wiederum auch matrix.hpp inkludiert.
    Wenn du die nicht hast, wirst du, wegen der Verletzung der ODR (One Definition Rule) einen Compile Error bekommen.



  • Oh, das habe ich in der Tat falsch verstanden.
    In der Sprache, die ich vorher benutzt habe, hat das ganze anders funktioniert, darum war es für mich logisch, .cpps auch einzubinden.

    Vielen Dank für eure Hilfe!


Log in to reply