Es ist alles im Titel; Super einfach, denke ich, aber es ist so schwer, irgendwo nach syntaktischen Dingen zu suchen.
Dies sind zwei Bibliotheksdateien, aus denen ich kopiere CS50.netund ich frage mich, warum sie zwei verschiedene Erweiterungen haben.
.c : c-Datei (wo im Allgemeinen die eigentliche Aktion stattfindet)
.h : Header-Datei (muss in einen Präprozessor eingeschlossen werden #include
Richtlinie). Enthält Dinge, die normalerweise mit anderen Teilen Ihres Codes geteilt werden, wie Funktionsprototypen, #define’d-Zeug, externe Deklaration für globale Variablen (oh, der Horror) und dergleichen.
Technisch gesehen könnten Sie alles in einer einzigen Datei ablegen. Ein ganzes C-Programm. Millionen Zeilen. Aber wir Menschen neigen dazu, Dinge zu organisieren. Sie erstellen also verschiedene C-Dateien, die jeweils bestimmte Funktionen enthalten. Das ist alles schön und sauber. Dann merkst du plötzlich, dass a Erklärung Sie in eine bestimmte C-Datei haben, sollte auch in einer anderen C-Datei vorhanden sein. Sie würden sie also duplizieren. Am besten ist es daher, die Deklaration zu extrahieren und in eine gemeinsame Datei, die .h, zu packen
Beispielsweise finden Sie in der cs50.h sogenannte “Forward Declarations” Ihrer Funktionen. Eine Vorwärtsdeklaration ist eine schnelle Möglichkeit, dem Compiler mitzuteilen, wie eine Funktion aufgerufen werden soll (z. B. welche Eingabeparameter) und was sie zurückgibt, damit er eine ordnungsgemäße Überprüfung durchführen kann (z. B. wenn Sie eine Funktion mit der falschen Anzahl von Parametern aufrufen, wird es werde reklamieren).
Ein anderes Beispiel. Angenommen, Sie schreiben eine .c-Datei, die eine Funktion enthält, die den Abgleich regulärer Ausdrücke durchführt. Sie möchten, dass Ihre Funktion den regulären Ausdruck, die zu vergleichende Zeichenfolge und einen Parameter akzeptiert, der angibt, ob beim Vergleich zwischen Groß- und Kleinschreibung unterschieden werden muss.
in der .c werden Sie daher setzen
bool matches(string regexp, string s, int flags) { the code }
Nehmen wir nun an, Sie möchten die folgenden Flags übergeben:
0: wenn bei der Suche zwischen Groß- und Kleinschreibung unterschieden wird
1: wenn bei der Suche zwischen Groß- und Kleinschreibung unterschieden wird
Und Sie möchten sich für neue Flags offen halten, also haben Sie keinen booleschen Wert gesetzt. Das Spielen mit Zahlen ist schwierig, also definieren Sie sinnvolle Namen für diese Flags
#define MATCH_CASE_SENSITIVE 0
#define MATCH_CASE_INSENSITIVE 1
Diese Informationen werden in die .h-Datei eingefügt, denn wenn ein Programm diese Labels verwenden möchte, kann es sie nur kennen, wenn Sie die Informationen einfügen. Natürlich können Sie sie in die .c einfügen, aber dann müssten Sie den .c-Code (ganz!) einfügen, was Zeitverschwendung und eine Quelle von Ärger ist.
Natürlich gibt es nichts, was besagt, dass die Endung eine Header-Datei sein muss .h
und die Endung einer C-Quelldatei sein muss .c
. Dies sind nützliche Konventionen.
E:\Temp> type my.interface
#ifndef MY_INTERFACE_INCLUDED
#define MYBUFFERSIZE 8
#define MY_INTERFACE_INCLUDED
#endif
E:\Temp> type my.source
#include <stdio.h>
#include "my.interface"
int main(void) {
char x[MYBUFFERSIZE] = {0};
x[0] = 'a';
puts(x);
return 0;
}
E:\Temp> gcc -x c my.source -o my.exe
E:\Temp> my
a
Sie sind nicht wirklich Bibliotheksdateien. Sie sind nur Quelldateien. Wie Stefano sagte, die .c Datei ist die C-Quelldatei, die tatsächlich die tatsächliche Quelle dessen verwendet / definiert, was sie lediglich in der Datei skizziert hat .h Datei, die Header-Datei. Die Header-Datei umreißt normalerweise alle Funktionsprototypen und -strukturen, die in der eigentlichen Quelldatei verwendet werden. Stellen Sie es sich wie eine Referenz / einen Anhang vor. Dies wird deutlich, wenn Sie sich die Header-Datei ansehen, wie Sie sehen werden 🙂 Wenn Sie also etwas verwenden möchten, das in diesen Quelldateien geschrieben wurde, müssen Sie #include
die Header-Datei, die die Informationen enthält, die der Compiler kennen muss.
.c ist die Quelldatei und .h ist die Header-Datei.
Die .c-Dateien sind Quelldateien, die kompiliert werden. Die .h-Dateien werden verwendet, um die API eines Programms entweder einem anderen Teil dieses Programms oder einem anderen Programm bereitzustellen, wenn Sie eine Bibliothek erstellen.
Beispielsweise könnte das Programm PizzaDelivery 1 .c-Datei mit dem Hauptprogramm und 1 .c-Datei mit Hilfsfunktionen haben. Damit der Hauptteil des Programms nun die Hilfsfunktionen verwenden kann, müssen Sie die API über den Funktionsprototyp in einer .h-Datei bereitstellen, wobei diese .h-Datei in die Haupt-.c-Datei eingeschlossen wird.
.c : 'C' source code
.h : Header file
Normalerweise ist die .c
Dateien enthalten die Implementierung und .h
Dateien enthalten die “Schnittstelle” einer Implementierung.