Forum: PC-Programmierung Header-Dateien in C und Zusatzmodule


von Anfaenger (Gast)


Lesenswert?

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"?

von Bitflüsterer (Gast)


Lesenswert?

> 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.

von Anfaenger (Gast)


Lesenswert?

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?

von DirkB (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

PS: häufig werden Compiler und Linker nicht getrennt nacheinander 
aufgerufen, sondern z.B. nur als gcc.
Intern laufen die beiden Schritte aber nacheinander.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

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
Noch kein Account? Hier anmelden.