2012-03-30 11 views
1

Was ist der Unterschied zwischen einem Include in .h-Datei und .c-Datei. Zum Beispiel habe ich die Datei a.h und a.c, die die Klasse A haben. Ich verwende Klasse A in Klasse B (b.h, b.c). Was ist der Unterschied zwischen einem Include:Unterschied zwischen enthalten in .h-Datei und .c-Datei

in b.h vs b.c.

+0

Sie können keine .c files einschließen =) – karlphillip

+5

@karlphillip: Warum nicht? :) – sth

+0

Ich glaube, ich habe die Frage missverstanden. – karlphillip

Antwort

3

Normalerweise befindet sich die Klassendefinition normalerweise in Ihrer .h-Datei und die Implementierung befindet sich in Ihrer .c (pp) -Datei.

Ein Vorteil von #include "a.h" in Ihrer b.c-Datei und nicht in Ihrer b.h-Datei ist, dass, wenn sich a.h ändert, nicht nur b.c, sondern auch jede andere Datei, die b.h enthält, neu kompiliert wird.

Sie sind auch nicht unnötig Implementierungsdetails von B zu offenbaren jedermann mit b.h. Die Idee ist, dass b.h keine zusätzlichen Informationen enthalten sollte, die für jemanden, der Klasse B verwendet, nicht von Interesse sind (nicht weil es geheim ist, sondern weil es den Leuten egal ist und man sie nicht damit belästigen möchte).

Es ist nicht nötig, irgendjemanden, einschließlich b.h, zu zwingen, indirekt auch ein Dutzend anderer .h-Dateien einzuschließen (weil sie in b.h enthalten sind), nur weil Sie dieses Zeug in b.c. Vermeiden Sie Unordnung.

Also, wenn möglich, ist es am besten zu #include "a.h" in b.c!

Aber das ist nicht immer möglich. Wenn Sie nur A in B.c verwenden und es keine Referenzen auf A in B.h.h gibt, dann ist es in Ordnung. Auch wenn bh nur enthält Zeiger auf A (dh als Mitglieder, Funktionsargumente oder Rückgabewerte), aber keine ‚Typ abhängig‘ Referenzen, können Sie auch nur diese in bh setzen könnte:

class A; 

Und noch halten #include "a.h" in Ihrem bc Aber wenn es mehr Referenzen oder Abhängigkeiten zu a.h gibt, auf die auch b.h wirklich nicht verzichten kann, dann sollte #include "a.h" gehen in b.h

2

Es gibt keinen Unterschied bei der Aufnahme einer Header-Datei in .h oder .c Datei.
Der Inhalt der enthaltenen Datei wird nur in die Datei kopiert, in die Sie ihn eingefügt haben.

+0

Für Code-Erweiterung ist dies wahr, aber als Header werden oft wiederverwendet, einschließlich einer anderen Header hat erhebliche Auswirkungen (Kompilierzeit, ziehen Namen im globalen Namespace, ...) – KillianDS

+0

Ich habe einen Fall, wo eine .h-Datei in .c-Datei statt einer .h reduzierten Kompilierungszeit. Die eigentlichen Klassendetails sind zu komplex, um hier zu schreiben, da ich selbst an einem kleinen Teil arbeite. Also nur konzeptionell/Standpunkt eines Compilers, fragen sich, wie dies die Kompilierungszeit ändert? – Romonov

+0

Der obige Kommentar wurde beantwortet. Danke auch für deine Antwort. – Romonov

0

#include "a.h" erweitert auf den Inhalt von a.h.

Wenn #include "a.h" in b.h platziert ist, wird a.h während der Kompilierung in b.h kopiert.

Wenn #include "a.h" in b.c platziert wird, wird a.h während der Kompilierung stattdessen in b.c kopiert.

0

.h-Dateien an der Spitze der .c oder .h-Dateien setzen, bevor

kompilieren, aber .c Dateien kompilieren separat verknüpfen dann Getter ausführbare Datei

1

Wenn Sie die in Ihrem Header enthalten Direktive setzen zu machen Datei, andere Dateien, die diese Header-Datei enthalten, erhalten auch den enthaltenen Header.

foo.h:

#include "dependency.h" 

bar.h:

#include "foo.h" 

In diesem Fall bar.h sowohl foo.h und dependency.h hat.

0

Sie können .c Dateien einschließen - aber per Konvention nicht.

.h Dateien sind für Deklarationen - d. H. Die .c Datei ist die Definition und die .h Datei wird dies tun. Es ist wie die .h Datei ist der Inhalt des Kochbuchs, und die .c Datei ist die tatsächlichen Rezepte.