Wie andere erwähnt haben, ein Kopf foo.h die Informationen erklären sollte notwendig in der Lage sein, die von einer Quelldatei foo.c. Dazu gehören die Typen, Aufzählungen und Funktionen von foo.c. (Sie verwenden keine globalen Variablen, oder? Wenn Sie das tun, werden diese auch in foo.h deklariert.)
Der Header foo.h sollte in sich geschlossen und idempotent sein. Self-contained bedeutet, dass jeder Benutzer foo.h einschließen kann und sich nicht darum kümmern muss, welche anderen Header möglicherweise benötigt werden (da foo.h diese Header enthält). Idempotent bedeutet, dass wenn der Header mehrfach enthalten ist, kein Schaden entsteht.Dies wird durch die klassische Technik erreicht:
#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED
...rest of the contents of foo.h...
#endif /* FOO_H_INCLUDED */
Die Frage:
Datei foo.c enthält foo.h, die alle Erklärungen für foo.c enthält; Gleiches für bar.c und bar.h. Die Funktion foo1() innerhalb von foo.c ruft bar1() auf, was in bar.h deklariert und in bar.c definiert ist. Jetzt ist die Frage, sollte ich bar.h innerhalb foo.h oder innerhalb foo.c einschließen?
Es hängt davon ab, ob die von foo.h bereitgestellten Dienste von bar.h abhängig sind oder nicht. Wenn andere Dateien, die foo.h verwenden, einen der Typen oder Enumerationen benötigen, die von bar.h definiert sind, um die Funktionalität von foo.h zu verwenden, sollte foo.h sicherstellen, dass bar.h eingeschlossen ist (indem es eingeschlossen wird). Wenn jedoch die Dienste von bar.h nur in foo.c verwendet werden und nicht von denen, die foo.h verwenden, nicht benötigt werden, dann sollte foo.h bar.h nicht enthalten
Der einzige Grund für das Erstellen einer Kopfzeile ist, weil Mehr als eine Quelldatei benötigt die Information. Der foo_int.h-Header sollte außerhalb von foo.h nicht benötigt werden, also sollte er nicht erstellt oder verwendet werden - sein Inhalt kann direkt in foo.c platziert werden. –
Fortsetzung: Sie würden foo_int.h verwenden, wenn Sie mehr als eine Quelldatei mit der Funktionalität von 'foo.c' haben - sagen wir foo1.c und foo2.c. Dann macht der interne Header Sinn. Sie sollten jedoch darauf achten, die Dinge so kompakt zu halten, dass die C-Datei-Aufteilung unnötig ist. –
Ich habe festgestellt, dass das Aufteilen der Dateien eine gute Technik ist, wenn Sie lange Typ-, Konstanten- oder MACRO-Definitionen haben, die nur für foo.c benötigt werden. Es ist besser, sie in einer Header-Datei als direkt in der Quelldatei zu haben. Adam Liss zeigte eine bessere Lösung an, alles in der gleichen .h Datei zu haben – kgiannakakis