2009-07-22 9 views
10

Ich versuche, den Zweck hinter einem Header pro Quelldateimethode zu verstehen. Wie ich es sehe, sind Header dafür gedacht, Funktionsdeklarationen, typedef's und Makros zwischen mehreren Dateien zu teilen, die sie benutzen. Wenn Sie eine Header-Datei für Ihre .c-Datei erstellen, hat es den Nachteil, dass Sie jedes Mal, wenn Sie eine Funktionsdeklaration oder ein Makro sehen möchten, auf die Header-Datei verweisen müssen, und im Allgemeinen ist es einfacher, dass alles in einer Quelldatei ist ganze Software, natürlich).Header pro Quelldatei

Warum verwenden Programmierer diese Methode?

Antwort

6

Die Header-Dateien in C separate Deklarationen (die für jede .c-Datei verfügbar sein müssen, die die Funktionen verwendet) aus den Definitionen (die an einem Ort sein müssen). Außerdem bieten sie ein wenig Modularität, da Sie nur die öffentliche Schnittstelle in eine Header-Datei einfügen können und Funktionen und statische Variablen, die in der .c-Datei enthalten sein sollten, nicht erwähnen. Das verwendet das Dateisystem, um eine öffentliche Schnittstelle und eine private Implementierung bereitzustellen.

Die Praxis einer .h-Datei zu einer .c-Datei ist meistens Bequemlichkeit. Auf diese Weise wissen Sie, dass die Erklärungen in der.h-Datei und die Definitionen in der entsprechenden .c-Datei.

+0

wenn ich Erklärungen haben, brauchen von mehreren Dateien geteilt werden, und sie entsprechen nicht logisch einer .c-Datei? sagen wir einige # define's, die von den meisten Dateien benutzt werden. Ist es nicht besser, eine Header-Datei mit all diesen zu erstellen? etwas Neutrales, das sich nicht mit einer .c-Datei verbindet? –

+2

Ja. Die Idee ist, dass jeder Header eine Gruppe von Deklarationen enthält, die sich aufeinander beziehen. In den meisten Fällen passt es, dass jede .c-Datei über eine entsprechende .h-Datei verfügt. Sie können jedoch zusätzliche .h-Dateien hinzufügen (z. B. um globale Konstanten oder Enums zu definieren). Letztendlich sind Sie dafür verantwortlich, wie Sie mit Kopfzeilen Ihren Code organisieren. –

+1

@JasonWilliams: Oder zusätzliche .c-Dateien, was auch immer angebracht ist. – Deduplicator

0

Im Allgemeinen bedeutet ein Header für eine Quelldateimethode, dass Sie nur die Funktionen dieser Kompilierungseinheit in diesem Header deklarieren.

So verschmutzen Sie nicht mit Erklärungen, die Sie nicht brauchen. (in großen Software-Projekt könnte ein Problem sein)

Wie für separate Kompilierungseinheiten, beschleunigen diese die Kompilierung und können Sie Kollisionen zu vermeiden, wenn private Symbole als statisch deklariert werden.

1

Sie benötigen keine Kopfzeile pro Quelldatei. Eine Kopfzeile pro Modul, die die öffentliche Schnittstelle enthält, und möglicherweise eine zusätzliche Kopfzeile mit privaten Deklarationen usw., die zwischen Dateien in diesem Modul geteilt werden.

4

Weil, wie Sie selbst sagten, es nicht machbar ist, die "ganze Software" in eine Quelldatei zu legen.

Wenn Ihr Programm sehr klein ist, dann ist es ja einfacher, alles in eine .c Datei zu schreiben. Wenn Ihr Programm größer wird, wird es hilfreich, Dinge zu organisieren, indem verwandte Funktionen in verschiedenen .c-Dateien zusammengefasst werden. Außerdem können Sie in den .h-Dateien die Deklarationen einschränken, die Sie Deklarationen von Dingen geben, die angeblich sind, um von Dingen in anderen .c-Dateien verwendet zu werden. Wenn eine .c-Datei nichts enthält, auf das außerhalb von ihr zugegriffen werden kann, benötigt sie keine Kopfzeile.

Zum Beispiel, wenn .c hat Funktion foo() und fooHelper(), aber niemand außer foo() soll fooHelper() direkt aufrufen, dann durch foo() und fooHelper() in foo.c setzen, nur die Deklaration von foo() in foo.h setzend, und fooHelper() als statisch deklarierend, hilft es zu erzwingen, dass andere Teile Ihres Programms nur auf foo() zugreifen sollten und fooHelper() nicht wissen oder interessieren sollten. Art einer nicht objektorientierten Form der Verkapselung.

Schließlich sind Suchmaschinen in der Regel intelligent genug, um nur die Dateien wiederherzustellen, die sich seit dem letzten Build geändert haben. Die Aufteilung in mehrere .c-Dateien (mit .h-Dateien zum Teilen von Teilen) beschleunigt die Erstellung.

4

Sie geben nur Ihre Header-Datei das absolute Minimum, das andere Quelldateien "sehen" müssen, um zu kompilieren. Ich habe einige Leute gesehen, die alles Nicht-Code in die Header-Datei geschrieben haben (alle Typedefs, alle # define, alle Strukturen, etc.), auch wenn nichts anderes in der Codebase diese verwendet. Das macht die Header-Datei für Sie und diejenigen, die Ihr Modul verwenden möchten, viel schwerer zu lesen.

6

Logisch, strukturierte Organisation und kleine Quelldateien ermöglichen:

  • schneller, besser Programmierung - den Code in überschaubare und verständliche Brocken brechen macht es leichter zu finden, zu verstehen und den entsprechenden Code bearbeiten.
  • Code-Wiederverwendbarkeit - verschiedene "Module" des Codes können in Gruppen von Quell-/Header-Dateien unterteilt werden, die Sie leichter in verschiedene Programme integrieren können.
  • besser "Einkapselung" - Nur die .c-Dateien, die speziell diesen Header enthalten, können die Funktionen verwenden, die Ihnen helfen, die Beziehungen zwischen verschiedenen Teilen Ihres Codes zu minimieren, was die Modularität unterstützt. Es hindert Sie nicht daran, Dinge von überall zu verwenden, aber es hilft Ihnen, darüber nachzudenken, warum eine bestimmte c-Datei auf Funktionen zugreifen muss, die in einem bestimmten Header deklariert sind.
  • Aids Teamarbeit - zwei Programmierer, die versuchen, die gleiche Code-Datei gleichzeitig zu ändern, verursachen normalerweise Probleme (z. B. exklusive Sperren) oder zusätzliche Arbeit (z. B. Code-Zusammenführungen), die sich gegenseitig verlangsamen.
  • schneller kompiliert - wenn Sie einen Header haben, dann jedes Mal, wenn Sie eine Änderung vornehmen, müssen Sie alles neu kompilieren. Bei vielen kleinen Headern müssen nur die C-Dateien, die den geänderten Header enthalten, neu erstellt werden.
  • einfacher Wartbarkeit & Refactoring - für alle oben genannten Gründen

Insbesondere „ein Header für jede Quelldatei“ macht es sehr einfach, die Erklärungen, die für die C-Datei zu finden, in der Sie arbeiten. Sobald Sie beginnen, mehrere Header zu einer einzigen Datei zusammenzufügen, wird es schwierig, die c- und h-Dateien zu verknüpfen, und letztendlich wird das Erstellen einer großen Anwendung viel schwieriger. Wenn Sie nur an einer kleinen Anwendung arbeiten, ist es immer noch eine gute Idee, sich an einen skalierbaren Ansatz zu gewöhnen.

3

Programmierer verwenden diese Methode, weil es sich Schnittstelle von Implementierung zu trennen erlaubt während , dass Client-Code und Umsetzung auf den Erklärungen der Funktionen zustimmen zu gewährleisten. Die .h-Datei ist der "einzige Punkt der Wahrheit" (siehe sich nicht selbst wiederholen) über den Prototyp jeder Funktion.

(Client-Code ist der Code, der #include ist der H-Datei, um die exportierten Funktionen zu verwenden, wird aber keine der Funktionen in der .h implementieren.)

Verwandte Themen