Funktionsweise Headerdateien



  • Hi Leute,

    wenn man eine klasse in zwei Extradateien programmiert (also klasse.cc und klasse.hh) und die dann in einem Programm über include einbindet:

    #include "klasse.hh"

    bindet man ja nur die Headerdatei ein. Woher weiß das Programm dann eigentlich, was in der .cc datei steht? Weil eigentlich kann man die Endungen doch so nennen wie man will, oder?

    Lieber Gruß
    Laura



  • Du musst aus jeder .cc Datei eine Objektatei (.o oder .obj) erzeugen und alle Objektdateien mit dem Linker zu einem Programm zusammenbinden. Die Header werden nicht im "Programm" eingebunden, sondern in jedem .cc, dass die Klassen oder Funktionen verwenden will.



  • ja aber ich erzeuge doch einfach die object-dateien und habe in meinem Hauptprogramm das include auf die Headerdatei. Mein Problem ist das selbe: woher weiß das Programm dass die object-dateien zu dem header gehören?

    (wobei die ham dann aj eigentlich alle die selbe Endung... sucht das Programm dann einfach danach?)



  • woher weiß das Programm dass die object-dateien zu dem header gehören?

    Die cc-Dateien werden mit einem handelsüblichen Compiler alle einzeln übersetzt und als o-Dateien abgelegt. Danach muss dem Linker gesagt werden, welche o-Dateien zum ausführbaren Programm zusammengebunden werden sollen. Normalerweise automatisiert man das mit Scripten, Makefiles oder anderen Buildsystemen. Wenn du eine IDE mit Projektverwaltung benutzt, geschieht das automatisch hinter den Kulissen.



  • Prometheus87 schrieb:

    Hi Leute,

    wenn man eine klasse in zwei Extradateien programmiert (also klasse.cc und klasse.hh) und die dann in einem Programm über include einbindet:

    #include "klasse.hh"

    bindet man ja nur die Headerdatei ein. Woher weiß das Programm dann eigentlich, was in der .cc datei steht? Weil eigentlich kann man die Endungen doch so nennen wie man will, oder?

    Lieber Gruß
    Laura

    Sagen wir mal, du hast eine Headerdatei, "Header.h". Dort stehen alle Funktionsheader drin, die man so braucht, aber nicht mit dem ganzen Quellcode. Der befindet sich in der "Header.cpp", wo die Funktionsdefinitionen stehen. Die "Header.cpp" bindet anfangs die "Header.h" ein, sodass der Linker weiß, zu welchen Deklarationen die Definitionen gehören.

    Später kann dann in der "Main.cpp" die "Header.h" eingebunden werden, ohne den Code der "Header.cpp" mit einzubinden, der liegt ja schon in kompiliertem Format in der Header.o/Header.obj (aus dem Quellcode der "Header.cpp") vor.

    Ganz einfach eigentlich.



  • Prometheus87 schrieb:

    Mein Problem ist das selbe: woher weiß das Programm dass die object-dateien zu dem header gehören?

    Das muss keiner wissen.

    Beim Linken wird einfach alles was in den verschiedenen Object-Files steht in einen grossen Pott geschmissen und zu einem Programm zusammengebunden.
    Wo eine bestimmte Funktion hergekommen ist, ist (mehr oder weniger) egal.

    Wenn du zwei Klassen hast, foo und bar, und foo.hh und foo.cc und bar.hh und bar.cc ... und dann aber ein paar Funktionen von foo in bar.cc definierst, und ein paar Funktionen von bar in foo.cc ... wieso sollte das irgendwen stören? (Tut es nicht, das compiliert und linkt und läuft wunderbar)



  • Dass ein Neiling das Konzept der getrennten Übersetzung nicht versteht, kommt öfters vor. Das letzte Mal, an das ich mich erinnern kann, war vor 5 Tagen. Vielleicht findest Du da auch noch nützliche Informationen.


Log in to reply