Hi Leuts, ich bin noch ein Anfänger und möchte gerne etwas zu Header-Dateien und Zusatzmodulen in C wissen. Ich habe im Internet eine Funktion gefunden, die aus zwei Dateien besteht: Datei.cpp Datei.h Ich habe zu der Datei ein Beispiel mit einer main-Funktion gefunden, die Datei könnte z.B. main.cpp heissen. In der main.cpp wird mit Include die Datei.h eingebunden. In der Headerdatei wird aber nicht mit Include die Datei.cpp eingebunden. In einem Verzeichnis gibts aber die Datei Datei.o - also das compilierte Produkt. Ist es richtig, dass ich in der Headerdatei Funktionen "definiere", damit sie vom Namen her bekannt sind und in der main.cpp verwendet werden können. Und damit das Programm später funktioniert, wird dann beim Linken die Datei Datei.cpp zum Endprogramm "zusammengekleistert"?
> Ist es richtig, dass ich in der Headerdatei Funktionen > "definiere", damit sie vom Namen her bekannt sind und > in der main.cpp verwendet werden können. Auf beide Fragen: Nein. Das Wort "definieren" hat in C/CPP eine genau beschriebenen Sinn. In einer Header-Datei werden Funktionen (u.a.) "deklariert". >Und damit das Programm später funktioniert, wird dann > beim Linken die Datei Datei.cpp zum Endprogramm > "zusammengekleistert"? Das Wort "zusammenkleistern" kommt in dem Zusammenhang überhaupt nicht vor. Du willst nicht zufällig Dein Zimmer tapezieren? Falls nicht, dann lies mal ein C-Buch.
Bitflüsterer schrieb: > Das Wort "zusammenkleistern" kommt in dem Zusammenhang überhaupt nicht > vor. Du willst nicht zufällig Dein Zimmer tapezieren? Was macht denn der Linker sonst? Ich habe doch die Datei.h, in der die Funktionen nun "deklariert" werden und mit Zusammenkleistern, dass die main.o zusammen mit der Datei.o zusammengelinkt (gekleistert) werden, aber die Datei.h muss in main.cpp eingebunden werden, damit die Funktionsnamen bekannt sind - wie soll ich es mir sonst vorstellen, wenn das falsch ist?
Anfaenger schrieb: > Was macht denn der Linker sonst? Die deutsche Bezeichnung dafür ist "binden" s.a https://de.wikipedia.org/wiki/Linker_%28Computerprogramm%29
Und alles in einem Stück: 1. du schreibst diverse Quelltexte, also *.c (*.cpp) und *.h mit einem Editor. Dabei werden die *.h in einigen oder allen der anderen Dateien mit #include... erwähnt. 2. Alle *.c und *.cpp werden vom Compiler übersetzt, daraus entstehen sogenannte Objektdateien (*.o unter Unix+Linux, *.OBJ in Windows). Der Compiler liest bei jedem #include... entsprechend die genannte Datei ein. (Genau genommen sind das eigentlich zwei Schritte: erst läuft ein Präprozessor, der #include und #define und gelegentlich noch etwas anderes auswertet, das Ergebnis wird an den eigentlichen Compiler weiter gereicht.) 3. Der Linker (oder Binder) nimmt alle Objektdateien und meist irgendwelche Libraries (*.a, *.so; Windows: *.LIB) und macht daraus ein ausführbares Programm. Wenn man an den Quelltexten etwas ändert, muß man die Schritte 2 und 3 wieder ausführen.
PS: häufig werden Compiler und Linker nicht getrennt nacheinander aufgerufen, sondern z.B. nur als gcc. Intern laufen die beiden Schritte aber nacheinander.
Anfaenger schrieb: > in der die > Funktionen nun "deklariert" werden und mit Zusammenkleistern, dass die > main.o zusammen mit der Datei.o zusammengelinkt (gekleistert) werden, > aber die Datei.h muss in main.cpp eingebunden werden, damit die > Funktionsnamen bekannt sind - wie soll ich es mir sonst vorstellen, wenn > das falsch ist? Dein "Kopfbild" passt schon. Es wird unterschienden zwischen "deklarieren" (=bekannt machen, daß ein Objekt existiert {ich hab hier ein Objekt "Eimer", da passen 10 Liter Wasser rein}), und "definieren" {Ich habe hier ein Objekt, welches folgenden Aufbau und Struktur hat: blau, zylindrisch, Boden, Henkel, ..}) "Bitfluesterer" wollte wohl darauf hinweisen, daß "zusammenkleistern" eher "Kindersprache" oder sowas ähnliches ist. Beim Programmieren ist es hingegen zweckmäßig, auf sehr exakte Bezeichnungen, und weitere Details zu achten. "unscharfe" Formulierungen [*1] rufen meistens Allergie-Reaktionen hervor, bzw. Threads welche ins Nirwana abgleiten. [*1] Lass mal sowas in einem Beitrag fallen, und warte die Reaktionen ab ;-) : "Ich hab hier sowas ähnliches wie eine if-Schleife, die aber nicht funktioniert. Was mache ich falsch?"
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.