Forum: PC-Programmierung Header in Imp- oder Specfile


von e1e22 (Gast)


Lesenswert?

Guten Morgen,

in der Programmiersprache C kann ich .h Dateien entweder in der 
specification oder in der implementaion einbiden.
Beispielsweise möchte ich die .h Datei "test.h" zur main.c hinzufügen.
In main.c ist die Datei main.h eingebunden.
Dann kann ich entweder in der main.h oder direkt in der main.c über 
include "test.h" hinzufügen.

Wo genau liegt darin der Unterschied bzw. wann darf ich die eine 
Möglichkeit und wann darf ich die andere Möglichkeit verwenden?
Gibt es etwas, worauf ich hier aufpassen muss?

Vielen Dank.

von Dr. Sommer (Gast)


Lesenswert?

Was ist denn eine "Specification" bei C?

#include kopiert einfach nur den Inhalt der Ziel-Datei in die aktuelle. 
Das ist nur eine dumme Text-Ersetzung. Die Auswirkungen hängen vom 
konkreten Inhalt der Dateien ab und kannts du dir daran selbst 
überlegen...

von Tom (Gast)


Lesenswert?

Die Funktionen, die ein Benutzer aus dem "Modul" blubb.c verwenden kann, 
werden in blubb.h deklariert. (Interne Hilfsfunktionen, die nur in 
blubb.c selbst gebraucht werden, werden sinnvollerweise nicht in 
blubb.h dem Rest der Welt bekanntgegeben, sondern in blubb.c vor der 
Verwendung deklariert (und sind static)). In jeder .c-Datei, in der 
Funktionen aus blubb.c benutzt werden, wird dann blubb.h #includet.

Die Abhängigkeiten zwischen Übersetzungseinheiten zu verschleiern, indem 
man die includes auslagert und womöglich zusammenfasst, führt irgendwann 
zu Chaos.

von Dr. Sommer (Gast)


Lesenswert?

Tom schrieb:
> Die Abhängigkeiten zwischen Übersetzungseinheiten zu verschleiern, indem
> man die includes auslagert und womöglich zusammenfasst, führt irgendwann
> zu Chaos.

Auch in Header-Dateien braucht man oft Deklarationen aus anderen 
Header-Dateien, weshalb man dort eben auch oft includes unterbringt. Ist 
z.B. in der test.h ein "struct Test" definiert, und in der main.c gibt 
es eine Funktion "void foo (struct Test* x)" gibt, und man diese in der 
main.h deklarieren möchte, muss man dort die test.h inkludieren.
Wenn man das "struct Test" aber nur in der main.c braucht, aber nicht in 
der main.h, sollte man das #include in die main.c packen, denn dann 
müssen nicht alle Dateien, welche die main.h inkludieren neu kompiliert 
werden, wenn sich die test.h ändert.

von Jack (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Was ist denn eine "Specification" bei C?

Irgend so ein Informatiker-Sprech.

Ansonsten gibt es mindestens vier Ansätze wie man Header gestaltet:

1) Ein Header bringt nur die notwendigen Definitionen und Deklarationen 
für  das zugehörige Modul/API mit. Abhängigkeiten werden nicht im Header 
inkludiert, sondern müssen separat in .c inkludiert werden:
1
#include <sys/types.h>
2
#include <sys/stat.h>
3
#include <fcntl.h>   // fcntl needs types.h and stat.h

Vorteil: Man kuenert sich in seinem Header nur um das ebtsprechende 
Modul
Nachteil: Der Anwender muss sich die Abhängigkeiten eventuell aus 
Fehlermeldungen zusammensuchen.


2) Ein Header bringt die Deklarationen für das zugehörige C-File mit und 
inkludiert selber alle benötigten Abhängigkeiten.
1
#include <stdio.h>  // as a side-effect provides a definition of NULL

Vorteil: Man erhält ein Komplettpaket für ein Modul.
Nachteil: Man erhält implizit Definitionen und Deklarationen die man 
eigentlich nicht wollte.

3) Chaos. Ein Header bringt einen Teil der Abhängigkeiten mit, den 
anderen Teil muss man selber inkludieren.

Vorteil: Keinen, außer dass es für den "scheissegal, läuft" Elite-Hacker 
einfach aussieht
Nachteil: Alle

4) Ein Mix aus allem

S.o.


Mit 1) und 2) kann man sich jeweils anfreunden, wenn es konsequent 
durchgezogen wird. Die anderen ergeben sich manchmal, wenn man schlecht 
entworfene Modul-APIs benutzen muss.

von Dr. Sommer (Gast)


Lesenswert?

Jack schrieb:
> Vorteil: Man kuenert sich in seinem Header nur um das ebtsprechende
> Modul

Inwiefern ist das ein Vorteil? Wenn man die includes onehin braucht und 
von den .c Dateien aus inkludieren muss, wird die Kompilation auch nicht 
schneller. m.E. sorgt 1) nur für Verwirrung; Header die man nur in einer 
bestimmten Reihenfolge inkludieren kann (weil die nicht die nötigen 
eigenen Includes mitbringen, und/oder Include Guards nicht korrekt 
genutzt werden) stören mich immer ziemlich...

Jack schrieb:
> Irgend so ein Informatiker-Sprech.
Also ich als Informatiker hab das noch nie gehört (bei C).

PS: Java-Entwickler lachen über solche Probleme ;-)

von Tom (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Auch in Header-Dateien braucht man oft Deklarationen aus anderen
> Header-Dateien, weshalb man dort eben auch oft includes unterbringt

Den Punkt habe ich vergessen zu beschreiben. Wogegen ich argumentieren 
wollte, sind Konstruktionen, wo jeder Header, der irgendwo im Projekt 
benötigt wird, in eine main.h includet wird und diese wiederum überall 
im Projekt includet wird.

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.