So verknüpfen Sie mehrere Implementierungsdateien in C

8

Ich habe eine Reihe von .c -Dateien, d. h. die Implementierungsdateien sagen

  • main.c
  • A.c
  • B.c

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.

    
Kraken 25.03.2013, 18:46
quelle

3 Antworten

18

Kopfzeileninhalt

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.

Verknüpfung

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%     
Jonathan Leffler 25.03.2013, 18:51
quelle
3

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.

    
Jack 25.03.2013 18:51
quelle
3

Es hängt vom Compiler ab, aber vorausgesetzt, Sie verwenden gcc, könnten Sie etwas wie folgt verwenden:

%Vor%

Schauen Sie Ссылка (erste Google-Antwort) für weitere Details. Sie könnten es in mehrere Objektdateien / Bibliotheken kompilieren:

%Vor%     
Youn Elan 25.03.2013 18:52
quelle