Warum muss ich eine .h-Header-Datei in die gleichnamige .c-Datei einfügen?

8

Also folge ich in Head First C und wir sind in einem Kapitel, wo wir lernen, mehrere Dateien zusammen zu kompilieren. Einer von ihnen ist encrypt.c .

%Vor%

Die Datei encrypt.h wiederholt die erste Zeile mit einem Semikolon am Ende, also warum brauche ich sie? Ich verstehe, warum ich Header-Dateien benötigen würde, um das Problem zu beheben, eine Funktion zu verwenden, bevor es definiert wird, also konnte ich # es in einer Datei, die encrypt.c verwendet, einschließen, aber warum sollte ich es in encrypt.c brauchen? Ist das nur einer dieser "Gründe"?

    
punstress 25.08.2013, 21:01
quelle

6 Antworten

16

Wenn der Inhalt von encrypt.c vollständig angezeigt wird, brauchen Sie nicht den Header. Aber es ist immer noch eine gute Idee, es einzuschließen, weil:

  1. Wenn eine Funktion in der Datei eine andere verwendet, dann ist die Reihenfolge der Definition wichtig, da der Aufgerufene vor dem Aufrufer definiert werden muss. Es ist sogar möglich, zwei Funktionen A und B zu verwenden, von denen jede die andere aufruft. In diesem Fall kann der Code nicht ohne mindestens eine Vorwärtsdeklaration kompiliert werden. Das Einschließen der Kopfzeile mit den Vorwärtsdeklarationen löst diese Probleme.
  2. Die Verwendung des Headers, genau wie Ihr Client-Code, ist eine gute Methode, um den Compiler auf Diskrepanzen zwischen den Signaturen in den Forward-Deklarationen und den tatsächlichen Funktionsdefinitionen hinweisen zu lassen. Wenn dieses Problem nicht erkannt wird, kann es zu einem "interessanten" Verhalten während der Laufzeit und viel Haarziehen führen.
Jon 25.08.2013, 21:06
quelle
6

Sie haben Recht, wenn das alles encrypt.h deklariert, müssen Sie es nicht in die Datei .c einfügen.

Sie tun es meistens aus Gründen der Konsistenz.

    
Luchian Grigore 25.08.2013 21:05
quelle
4

Stellen Sie sich vor, dass Sie encrypt.c in void encrypt(char *message, int i) { }

ändern

Wenn Sie encrypt.h nicht einschließen, werden Sie nicht bemerken, dass die anderen Dateien in Ihrer Anwendung nicht aktualisiert wurden, um den neuen Parameter zu übergeben. Wenn Sie gleichzeitig encrypt.h und encrypt.c aktualisieren, kann der Compiler nach Ihnen suchen.

    
dcaswell 25.08.2013 21:09
quelle
1

Es ist ein guter Stil. Manchmal teilt C-Datei mit Funktionsimplementierung und C-Datei mit Funktionsverwendung gemeinsame Deklarationen - Typen / Strukturen. Dies teilt Deklarationsstellen in der H-Datei. Zum Beispiel.

%Vor%     
Egg Head 25.08.2013 21:16
quelle
0

Es ist Prototyping der Funktion

Ссылка

    
chiliNUT 25.08.2013 21:07
quelle
0

Dann fügen Sie den Header in eine andere * .c-Datei ein, die der Compiler auf diese Weise kennt, die anderswo die Funktionsdefinition ist.

Das ist wie:

%Vor%

Nun weiß der Compiler in der Hauptfunktion nicht, was er mit afun () tun soll. Weil es nicht definiert wurde. Es wird also zu einem Compilerfehler führen.

Sie fügen also die Deklaration am Anfang oder vor der ersten Verwendung hinzu:

%Vor%

Wisse, dass der Compiler die Deklaration von afun kennt und hofft, dass sonst die Funktion definiert ist. Mit Header-Dateien ist es möglich, vorkompilierten C-Code zu verwenden. Das einzige, was der Compiler benötigt, ist die Deklaration der Funktion.

    
Alex44 25.08.2013 21:23
quelle

Tags und Links