Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.12.2010, 11:18

Include Listing 4.1

Hallo,

habe mich jetzt bis zur Seite 107 vorgekämpft und stoße hier auf eine für mich unlogische Stelle.

Es wird mittels include die Header Datei "includiert"^^.
Und in der *.hpp werden dann Prototypen erzeugt.
Auch in der 2ten .cpp Datei wird der Header eingeschloßen aber nirgends wird die zweite .cpp Datei mit einbezogen.
Wie wird denn diese verknüpft? Geschieht das automatisch?
Und warum erzeuge ich erst die Prototypen, wenn ich doch sowieso die FUnktionen übersichtlich auslager?
Im Buch wurde gesagt das ich Prototypen der Übersichtlichkeit halber vor der main erzeuge.
-> Die haben doch sicher einen anderen Sinn oder?

(: Hoffe mir kann da einer weiterhelfen stehe ein wenig auf dem Schlauch :D

2

26.12.2010, 11:27

Also zu deinen Fragen:
Die Cpp-Dateien musst du nirgendwo inkludieren ;) Der Compiler compiled jede .cpp, .c, ... in deiner Projektmappe, und die Header, die diese Inkludieren werden mit einbezogen.
Die Prototypen erzeugst du, damit die Funktionssignaturen schon vorher bekannt sind. Damit kannst du z.B. dann den Header inkludieren, und die Funktion nutzen, obwohl die Implementierung dieser garnicht in der nutzenden .cpp Datei ist, sondern ganz woanders.

BlazeX

Alter Hase

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

3

26.12.2010, 11:41

Ich habe das Buch zwar nicht gelesen, aber ich hoffe ich kann es dir trotzdem kurz erklären.
In der Header-Datei beschreibst du, was alles zur Verfügung steht. Also Funktionen, Klassen, Enumerationen, Templates, usw. Der Name der Funktion, die Namen der Parameter und ein kleiner Kommentar geben an, was die Funktion, Klasse etc. tun. Wie genau sie das tun, ist für den Header uninteressant.
Im Sourcecode steht dann, wie genau die Funktion das macht, was im Header beschrieben steht.
Man verwendet verschiedene Header- und Source-Dateien, um verschiedene Funktionen in einem Programm / einer Library inhaltlich von einander zu trennen. So hat man nicht endlos große Dateien, alles für die Übersicht.
Die Sourcedateien inkludieren die Header und sagen damit dem Compiler, was sie für Funktionen brauchen. Der Compiler kompiliert dann jede Source-Datei einzeln und hinterlässt einen "Verweis" auf Funktionen, die er nur durch den Prototyp kennt. Danach kommt der Linker zum Einsatz. Er "bastelt" aus allem, was kompiliert ist, das Programm zusammen. Die "Verweise" werden dann miteinander verknüpft.

Das ganze passiert mit der richtigen IDE automatisch. Ansonsten muss jede Cpp-Datei kompiliert und zusammen an den Linker übergeben werden. Eine IDE macht das automatisch.

Die Prototypen werden vorher erzeugt, um den Compiler zu sagen, was das überhaupt ist. Ein Funktion namens "IrgendwasFunktion" kann doch auch eine Variable, oder eine Konstante sein. Der Compiler muss immer vorher wissen, was gemeint ist.

Prototypen vor der main-Funktion hat man eigentlich nur bei Ein-Datei-Programmen. Normalerweise werden die Prototypen in separate Header geschrieben und die genaue Definition der Funktionen in separate Source-Dateien. Per Include im Source stellt man dem Compiler alle Funktionen vor und der Linker fügt alle zusammen.

4

26.12.2010, 11:43

Alles klar super (:
Das ging schnell und verständlich!
Danke!

5

24.04.2011, 18:28

Hallo,

ich hab mal eine Frage zum selben Thema.
Ich habe nähmlich die erste Zeile der Datei "Charakter.cpp" (#include "Charakter.hpp") enfernt und nach dem Compilieren festgestelt, dass das Programm
immernoch funktioniert.
Warum brauche ich diese Zeile denn nicht :?:

PS: Hoffe ihr könnt mir helfen, bin nähmlich noch ein Anfänger :D

6

24.04.2011, 19:00

Hallo Coder(),

in der Datei Charakter.cpp befinden sich lediglich zwei Funktionsdefinitionen und in der Datei Charakter.hpp befinden sich für diese beiden Funktionen die entsprechenden Vorwärtsdeklarationen. Eine Vorwärtsdeklaration ist für die Definition einer Funktion nicht von Relevanz. Ob also die Header-Datei inkludiert wird ist in diesem Fall egal. Wichtig ist nur, dass die Vorwärtsdeklarationen (die sich ja in der Header-Datei befinden) in die Haupt-Datei (wo sich die main-Funktion befindet) eingebunden werden. Deshalb ist hier das Einbinden der Charakter.hpp notwendig, sonst wird im Programm auf zwei Funktionen zugegriffen die erst später (nämlich in der Charakter.cpp) definiert werden und der Compiler weiß aber nicht das sie später noch definiert werden und spuckt dann einen Fehler aus.

Gruß
SaRu_

7

24.04.2011, 19:33

Vielen Dank für die Top-Erklärung! :thumbsup:
Freut mich, dass es so schnell ging.

PS: Frohe Ostern

Gruß
Coder()

Werbeanzeige