Header Dateien weglassen?



  • Zee++ schrieb:

    Wieso ist das ein Problem? [...] Diese doppelt gemoppelt soll einfach weg. Ich will nur mit Definitionen arbeiten. Warum sollte das ein Problem sein?

    weil bei separater Kompilierung mehrerer .c-Dateien der Kompiler bei Kompilierung von Datei A.c nicht weiß, was in Datei B.c steht. Der Kompiler muß aber trotzdem prüfen, daß du die in B.c definierten Funktionen in A.c in korrekter Weise aufrufst. Dazu muß der Kompiler bei Kompilierung von A.c die Signatur der Funktionen, die in Datei B.c definiert sind kennen. Und dazu braucht der Kompiler die Prototypen der in B.c definierten Funktionen schon in A.c. Da man die Prototypen nicht mehrfach schreiben will, schreibt man sie *einmal* in eine Datei B.h und schreibt in A.c (und in allen anderen .c-Dateien, wo Funktionen aus B.c aufgerufen werden): #include "B.h"

    Erst der Linker hat den Gesamt-Überblick über die Signaturen aller beteiligten Funktionen; das nützt beim Kompilieren aber nichts, denn der Linker kommt aber erst zum Einsatz, *nachdem* die verschiedenen Kompiler-Aufrufe aus den .c-Dateien Object-Code erzeugt haben.



  • Fytch schrieb:

    Dieser Punkt ist zugegebenermaßen zu vernachlässigen in Zeiten von 16-Thread Prozessoren und Ninja. 😉

    Das ist überhaupt nicht zu vernachlässigen. Die Buildzeit ist nach wie vor ein Riesenproblem. Dein Projekt muss nur groß genug sein.



  • Ich habe hier aber von kleinen Ein-Mann-Projekten geredet.



  • zufallswert schrieb:

    Zee++ schrieb:

    Wieso ist das ein Problem? [...] Diese doppelt gemoppelt soll einfach weg. Ich will nur mit Definitionen arbeiten. Warum sollte das ein Problem sein?

    weil bei separater Kompilierung mehrerer .c-Dateien

    Die seperaten .c Dateien werden aber alle in main.c inlkudiert und sollte, wie hier auch schon vorgeschlagen, dann ein .h umbenannt werden. Der Kompiler bekommt also sehrwohl den gesamten Code auf einmal zu Gesicht und kann bestimmt dadurch sehr gut optimieren.



  • wenn alles in einer einzigen compilation unit steht, muß nach funktionalen Änderungen an irgendeiner der .c-Dateien der gesamte Quellcode neu kompiliert werden. Das kann bei großen Projekten Stunden dauern. Inkrementelle Kompilierung ade.



  • Ob ich bei meinen Ein-Mann-Projekten, um die es hier geht, einen kompletten Rebuild mache oder nur die Dateien kompilieren lassen die Änderungen erfahren haben, macht hier auf dem i7 keinerlei merkbaren zeitlichen Unterschied.

    Ich denke wir können das Thema abharken. Es gibt für kleine Projekte keinen Nachteil wenn man Deklaration und Implementieren zusammenfasst und alles in eine einzelne Datei inkludiert.

    Ich kann mir also das doppelte Gefrickel sparen und habe nur die Hälfte an Dateien.


  • Mod

    Zee++ schrieb:

    Ich denke wir können das Thema abharken. Es gibt für kleine Projekte keinen Nachteil wenn man Deklaration und Implementieren zusammenfasst und alles in eine einzelne Datei inkludiert.

    Doch, es gibt gewaltige Nachteile. Du wolltest diese Antwort bloß nicht hören und die andere Antwort, die du gelobt hast, hast du leider nicht richtig verstanden. Lies den Thread am besten noch einmal in Ruhe und denk über das geschriebene nach und fühl dich nicht gleich persönlich angegriffen, wenn dir jemand erklärt, warum deine Schnappsideen nicht funktionieren werden.



  • Meine Schnapssidee funktioniert doch schon. Der Präprozessor macht aus meinen ganzen .c (die besser .h heißen sollten, aber die Implementierung enthalten wie bei header libs) einen einzige Datei und dann geht alles seinen normalen weg, wie bei einem "hello world" main.c

    Ich glaube hier hat nur einer verstanden worum es überhaupt geht. Ich habe es sicherlich auch falsch erklärt. Ich will in diesem Sinne keine Headerdateien weglassen, sondern die Implementierung immer komplett in den Headerdateien drin haben. Aber wie ich die Dateien dann nenne ist doch eigentlich total egal. Inkludieren ist doch nicht anderes als Cut & Paste.



  • Depp. Noob.



  • Thema kann jetzt nun wirklich geschlossen werden. Das was ich suchte gibt es schon und zwar in Headeronly Bibliotheken.

    Danke nochmals an Fytch der als einziger den Durchblick hier hatte.


Anmelden zum Antworten