2013-04-19 6 views
5

Was ist der Unterschied zwischen einer Header-Datei in eine Header-Datei im Gegensatz zu einer Header-Datei in einer Implementierungsdatei enthalten?einschließlich Dateien im Header vs Implementierungsdatei (C++)

Diese

Ex:

// test.h 
#include"globals.h" 

class Test 
{ 
    Test(); 
}; 

vs

//test.cpp 
#include"globals.h" 

Test::Test() 
{ 
} 
+0

Denken Sie daran, dass Ihre Kopfzeile 'test.h 'wahrscheinlich von anderen Dateien enthalten sein wird. 'Globals.h' wird von all diesen Dateien erstellt. Die '.cpp'-Datei wird jedoch von keiner anderen Person aufgenommen. – stardust

+0

Keine Datei verwendet irgendwas von '' globals.h' ', also sollte keiner es" einschließen ". –

Antwort

2

Das allgemeine Prinzip ist, dass Sie Abhängigkeiten vernünftigerweise möglich, wo immer minimieren wollen, so:

  • wenn Ihr Schnittstelle (.h) alles in einem bestimmten Header verweist dann muss, dass die Header in der Schnittstelle (.h)

  • #include werden, wenn Sie nur einen bestimmten Header in Ihrer Implementierung (CPP-Referenz) (und nicht in Ihrer Schnittstelle), dann sollten Sie nur diesen Header in der Implementierung enthalten #

  • Sie sollten auch versuchen, nur #include Header, die tatsächlich benötigt werden, obwohl dies schwierig sein kann, während der Lebensdauer ein großes zu halten Projekt

Wenn Sie also in obigem Beispiel nichts von globals.h in test.h referenzieren, aber in test.cpp darauf verweisen, sollte #include in test.cpp gehen. Wenn Sie irgendetwas von globals.h in test.h referenzieren, dann brauchen Sie #include in test.h.

0

Kein Unterschied wie es ist. .h Dateien werden verwendet, um Klassen und Variablen zu definieren, während .cpp Dateien die Implementierung sind.

Wir verwenden:

  • #include <> wenn die lib/h-Datei im Ordner lib zur Verfügung steht.
  • #include "", wenn es im aktuellen Ordner vorhanden ist .. (lib Pfad nicht angegeben)
+2

'# include' hat nicht nur mit Klassen und Variablen zu tun. Normalerweise deklarieren Sie auch (nicht definieren) in der Kopfzeile. Außerdem ist "lib" plattformspezifisch. –

0

Die kompilierte einzige, was die Datei .cpp ist.

Eigentlich ist das nicht wahr, eine Datei, die von der .cpp erzeugt wird, ist kompiliert.

Beim Generieren dieser anderen Datei kopieren #include Direktiven effektiv den Inhalt der Include-Datei in die generierte Datei.

Das ist alles, was passiert.

0

Soweit ich weiß, gibt es keinen Unterschied in der Aufnahme einer Header-Datei in der Quelle oder der Header-Datei. Beachten Sie, dass #include ein Präprozessor-Makro ist und dass es lediglich den Inhalt einer Header-Datei an dem Ort ersetzt, an dem sie enthalten ist.

In Ihrem Beispiel oben, wenn die Globals.h sieht so aus,

die Quelldateien, nachdem der Präprozessor seinen Job beendet hat, würde so aussehen.

/* #include "globals.h" */ 
#ifndef GLOBALS_H_ 
#define GLOBALS_H_ 

#define MYGLOBAL_VARIABLE 10 

#endif /* GLOBALS_H_ */ 

Test::Test() 
{ 
} 
1

Wenn Sie einige Implementierung spezifische externe Header einschließlich hatte, gehören Sie besser, sie in CPP-Datei-Header dependeny auf der API-Datei zu reduzieren. Das Einschließen von Drittanbieter-Headern in die cpp-Dateien ist eine gute Möglichkeit zum Verbergen von Daten, sodass Bibliotheksbenutzer nicht viel über Ihre Referenzen wissen.

Es empfiehlt sich, Header-Dateien genau an der Stelle einzufügen, an der sie benötigt werden, um die Berechtigung Ihres Codes zu erhöhen und Ihr Projekt für die zukünftige Entwicklung leicht modifizierbar zu machen.

0

#include ist ein einfacher Textersatz. Die Zeile wird durch den Inhalt der genannten Datei ersetzt. Also, wenn Sie A.h in B.h und B.h in C.cpp einschließen, dann wird der Inhalt von A.h schließlich in C.cpp eingefügt.

Wir versuchen normalerweise, solche Header-in-Header zu vermeiden. Häufig ist es möglich, stattdessen Forward-Deklarationen zu verwenden. Z.B. class Global;. Die große Ausnahme ist für Basisklassen. Der Header, der die abgeleitete Klasse definiert, muss den Header für die Basisklasse enthalten.

0

Wenn Sie Ihren Code als API in Form von Kopfzeilen und Bibliothek bereitstellen, müssen Sie sicherstellen, dass keine internen privaten Headerdateien in den Headerdateien enthalten sind, die die Schnittstelle definieren. In diesem Fall fügen Sie alle Ihre privaten Dateien in die CPP-Datei ein, die kompiliert wird und in .lib oder .a oder .dylib Datei gespeichert wird. Sonst wäre das ein Problem für den Benutzer, der Ihre API verwendet.

Sie sollten sicherstellen, dass die Dateien, die Sie in Ihrer Kopfzeile angeben, globals.h auf die Stelle zugreifen können, an der Sie test.h einschließen. Wenn dies nicht der Fall ist, schließen Sie globals.h in die CPP-Datei ein.