Ich habe eine Reihe von .c
-Dateien, d. h. die Implementierungsdateien sagen
Wo Funktionen von irgendeiner der Dateien irgendeine Funktion von einer anderen Datei aufrufen können. Meine Frage ist, brauche ich eine .h
d. H. Header-Datei für jede Implementierung von A und B, wobei jede Header-Datei die Definition von ALL die Funktionen in A oder B hat.
Außerdem wird main.c sowohl A.h
als auch B.h #included
enthalten?
Wenn jemand es endlich klarstellen kann, wie kann ich später die mehreren Dateien im Terminal kompilieren und ausführen?
Danke.
Der Header A.h
für A.c
sollte nur die Informationen enthalten, die für externen Code erforderlich sind, der die in A.c
definierten Funktionen verwendet. Es sollte keine statischen Funktionen deklarieren; es sollte keine statischen Variablen deklarieren; Es sollte keine internen Typen deklariert werden (Typen, die nur in A.c
verwendet werden). Es sollte sicherstellen, dass eine Datei nur #include "A.h"
verwenden und dann die von A.c
veröffentlichten Funktionen vollständig nutzen kann. Es sollte in sich abgeschlossen und idempotent sein (so können Sie es zweimal ohne Kompilierungsfehler einbeziehen). Sie können einfach überprüfen, ob die Kopfzeile eigenständig ist, indem Sie #include "A.h"
als erste #include
-Zeile in A.c
; Sie können überprüfen, ob es idempotent ist, indem Sie es zweimal hinzufügen (aber das ist besser als separater Test). Wenn es nicht kompiliert, ist es nicht in sich geschlossen. Ähnlich für B.h
und B.c
.
Weitere Informationen zu Kopfzeilen und Standards finden Sie unter Sollte ich verwenden #include
in headern? ', die auf einen NASA-Codierungsstandard verweisen, und' Verknüpfung mit einer statischen Bibliothek ", die ein Skript chkhdr
enthält, das ich zum Testen von Self-Containment und Idempotenz verwende.
Beachten Sie, dass main.o
von main.c
, A.h
und B.h
abhängt, aber main.c
selbst hängt nicht von den Headern ab.
Wenn es zur Kompilierung kommt, können Sie verwenden:
%Vor%Wenn Sie andere Optionen benötigen, fügen Sie sie hinzu (die meisten Flags am Anfang; Bibliotheken am Ende, nach dem Quellcode). Sie können jede Datei auch separat mit Objektcode kompilieren und dann die Objektdateien verknüpfen:
%Vor% Sie müssen nur dann eine Header-Datei angeben, wenn das, was in einer .c
-Datei deklariert ist, in einer anderen .c
-Datei erforderlich ist.
Im Allgemeinen können Sie eine Header-Datei für jede Quelldatei haben, in die Sie alle deklarierten Funktionen oder extern
-Symbole exportieren.
In der Praxis werden Sie nicht immer jede Funktion oder jede Variable, nur diejenige, die von einer anderen Quelldatei benötigt wird, exportieren müssen, und Sie müssen sie nur in die erforderliche Datei (und in die Quelle gepaart mit der spezifische Header-Datei).
Wenn Sie versuchen, zu verstehen, wie es funktioniert, denken Sie nur daran, dass jede Quelldatei einzeln kompiliert wird. Wenn Sie also etwas verwenden, das nicht direkt in der Quelldatei deklariert ist, muss es über einen Header deklariert werden Datei. Auf diese Weise kann der Compiler wissen, dass alles existiert und korrekt eingegeben wurde.
Tags und Links compilation c header implementation