Es gibt keinen technischen Unterschied. Der Compiler wird Sie gerne eine .c
Datei enthalten, oder kompilieren Sie eine .h
Datei direkt, wenn Sie möchten.
Es gibt jedoch einen großen kulturellen Unterschied:
Erklärungen (Prototypen) in .h
Dateien gehen. Die .h
Datei ist die Schnittstelle zu was auch immer in der entsprechenden .c
Datei implementiert ist.
Definitionen in .c
Dateien gehen. Sie implementieren die Schnittstelle in der Datei .h
angegeben.
Der Unterschied besteht darin, dass eine .h
Datei kann (und in der Regel) #include
d in mehrere Übersetzungseinheiten (.c
Dateien). Wenn Sie definieren eine Funktion in einer .h
Datei, wird es in mehreren .o
Dateien enden, und der Linker wird sich über ein mehrfach definiertes Symbol beschweren. Deshalb sollten Definitionen nicht in .h
Dateien gehen. (Inline-Funktionen sind die Ausnahme.)
Wenn eine Funktion in einer .c
-Datei definiert ist, und Sie wollen es verwenden, um von anderen .c
Dateien, eine Erklärung dieser Funktion muss in jedem dieser anderen .c
Dateien zur Verfügung steht. Deshalb setzen Sie die Deklaration in eine .h
und #include
, dass in jedem von ihnen. Sie können auch die Deklaration in jeder .c
Datei wiederholen, aber das führt zu einer Menge Code-Duplizierung und einem nicht behebbaren Chaos.
Wenn eine Funktion in einer .c
-Datei definiert ist, aber Sie nicht es von anderen .c
Dateien verwenden möchten, gibt es keine Notwendigkeit, es im Header zu erklären. Es ist im Wesentlichen ein Implementierungsdetail dieser .c
Datei. Nehmen Sie in diesem Fall auch die Funktion static
vor, damit es nicht mit identisch benannten Funktionen in anderen Dateien kollidiert.
Leider, obwohl der Standard nichts vorschreibt, hängen die meisten Compiler, die ich verwendet habe, zu einem gewissen Grad von der Dateierweiterung ab. Versuchen Sie Folgendes: Erstellen Sie zwei Dateien, die (sagen wir '' int main() {return 0;} ') namens' header.c' und 'header.h' enthalten und versuchen Sie diese mit gcc zu kompilieren.(Ich bin nicht einmal in der Nähe von VS!) – dirkgently
Ich vermute, dass die meisten Programmierer nicht die Deklarationen von statischen Funktionen in der .h-Datei setzen. Der Hauptunterschied zwischen .h und .c besteht zwischen der Schnittstelle und der Implementierung. – Dipstick
@dirkgently: Okay, aber Ihr Compiler verhält sich nicht wie ein C-Compiler, wenn er nicht die richtige Dateierweiterung bekommt. Der Standard sagt nichts über Programme, die nicht C-Compiler sind :) – Thomas