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.
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...
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.
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.
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.
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.