Mit Blick auf dieses Projekt (http://www.savarese.com/software/libssrckdtree/) habe ich die Definition "C ++ Header-only template library" gefunden. Im Moment habe ich grundlegende C ++ Kenntnisse, möchte aber wissen was das genau bedeutet und warum diese Leute es bei diesem Projekt verwenden.
Dies bedeutet, dass alle Definitionen der Vorlage (Funktionsvorlage oder Klassenvorlage) nur in den Kopfzeilen enthalten sind. Es gibt keine .cpp
-Datei. Es gibt nur .h
Dateien (oder einige andere Erweiterungen wie .hpp
oder keine Erweiterung wie <vector>
, string>
usw.)
C ++ - Compiler erfordern, dass die Definitionen von Vorlagen in derselben Datei vorhanden sind, in der sie deklariert sind. Daher ist die Nur-Header-Bibliothek weder eine statische Bibliothek noch eine dynamische Bibliothek. Seine Quellcode Bibliothek, was bedeutet, dass Sie die Implementierung in den Kopfzeilen sehen können. Sie haben die Headerdateien in Ihren Code eingefügt, die zusammen mit den Headern aus der Bibliothek kompiliert werden.
Beachten Sie, dass der Teil der C ++ - Standardbibliothek, der Vorlagen wie <vector>
, string>
, <map>
usw. verwendet, eine Nur-Header-Bibliothek ist.
Tatsächlich können Vorlagen (Klassenvorlagen und Funktionsvorlagen) nicht in statische oder dynamische Bibliotheken kompiliert werden, um mit Programmen verknüpft zu werden. Eine Vorlage ist, wie der Begriff selbst sagt, eine Vorlage; Es ist kein normaler Code. Nur wenn Sie es in Ihren Code-übergebenen Template-Argumenten verwenden (was entweder type
oder value
ist), generiert der Compiler eine kompilierbare Funktion / Klasse aus der Funktion / Klassenvorlage:
Hier kann A
nicht in Binärdateien kompiliert werden (statische Bibliothek oder dynamische Bibliothek), weil der Compiler nicht weiß, was T
ist. Aber B
kann in Binärdateien kompiliert werden, da der Compiler vollständige Informationen darüber hat.
Sie können also den Ausdruck "Klassenvorlage A" lesen: A
ist eine Vorlage für eine Klasse. A
selbst ist keine Klasse. Aber B
ist eine Klasse, es ist keine Vorlage.
Da die Klassenvorlage A
nicht in eine statische oder dynamische Bibliothek kompiliert werden kann, um mit Ihren Programmen verknüpft zu werden, kann A
nur als header-only
library mit vollem Quellcode geliefert werden. Ebenso
Einige Bibliotheken haben die Form einer binären Datei, die Sie mit Ihrem Projekt verknüpfen müssen, zusammen mit einer Header-Datei, die die verfügbaren Klassen oder Funktionen definiert. Eine "Nur-Header-Bibliothek" wäre eine Bibliothek, die keine Binärdatei enthält, sondern nur eine Kopfzeile, die Sie in Ihre Quelle aufnehmen.
Vorlagen sind Klassen oder Funktionen, die an ihre spezielle Verwendung angepasst sind; Sie werden normalerweise in einer Header-Datei definiert, da der Compiler ihre Quelle lesen muss, um sie anzupassen. Sie können eine Vorlage erst dann zu einer Binärdatei kompilieren, wenn Sie genau wissen, wie sie verwendet wird. Sie fügen also die Quelle zusammen mit Ihrem eigenen Code ein und der Compiler kann sie dann zusammen verarbeiten.
Es bedeutet genau, dass die Bibliothek nur als Header neu verteilt wurde. Um es zu verwenden, müssen Sie es nur in Ihren Quelldateien enthalten.
Die kurze Antwort lautet, dass Vorlagen ähnlich wie Makros für den Compiler sind, um Code zu generieren. Jedes Mal, wenn Sie es instanziieren (z. B. mit einem Typ wie std::list<int>
), muss der Compiler den ursprünglichen Code haben, um den korrekten Typ (in diesem Fall int
) in den Code der Template-Klasse einzufügen. Aus diesem Grund werden Template-Klassen jedes Mal in .h
-Dateien eingefügt, wenn Sie sie in .cpp
files verwenden müssen.
Es bedeutet, dass der gesamte Code in Header-Dateien ist; Es gibt keine Bibliotheken mit der Bibliothek verbunden. Was das in der Praxis bedeutet Das hängt im schlimmsten Fall davon ab, dass der Autor nie selbst hat kompiliert den Code :-). Höchstwahrscheinlich bedeutet es, dass der Code nie hat wurde mit der genauen Kombination von Compiler, Version und Optionen getestet dass Sie verwenden, und dass Kompilierzeiten hoch schießen werden. Auf dem anderen Hand, es bedeutet, dass Sie die Bibliothek verwenden können, auch wenn der Autor nicht habe Zugriff auf den gleichen Compiler wie du, und du bist nicht gezwungen zu verwenden welche Möglichkeiten er auch benutzte, als er die Bibliothek kompilierte. Oder Wenn es sich um Open Source handelt, müssen Sie die Bibliothek nicht erstellen dich selbst.
Es bedeutet, dass keine Module in der Bibliothek vorhanden sind, nur Header. Dies bedeutet, dass die Bibliothek verwendet werden kann, ohne dass sie zuerst kompiliert und später verknüpft werden muss; Fügen Sie einfach die Header in Ihre eigenen Quellmodule ein.
Die Vorteile dieses Ansatzes sind
In diesem Fall wurde die Datenstruktur des Containers auf der Grundlage der Art von Daten implementiert, die sie enthält, sodass sie nicht vollständig kompiliert werden kann.
Für Vorlagenbibliotheken ist es möglich, alle Funktionen nur in Kopfzeilen (.h-Dateien) bereitzustellen, da Compiler traditionell die vollständige Definition der Vorlagenklasse benötigten, um sie für einen bestimmten Typ instanziieren zu können. Es gibt nichts, was in eine Bibliothek geschrieben werden kann, es sei denn, die Bibliothek wird vorinstanzierte Versionen bereitstellen oder es gibt einen Teil der Vorlagenbibliothek, der nicht als Vorlage verwendet werden muss.
Es ist nur "Header", weil es keine separaten .cpp-Dateien enthält, sondern nur .h-Dateien und Sie können einfach #include
den gesamten Bibliothekscode in Ihren Code einfügen.
Dies kann von Vorteil sein, da Sie nicht mit einer statischen Bibliothek verknüpfen müssen , was sehr schmerzhaft sein kann .
>Es bedeutet, dass Sie während der Verknüpfungsphase Ihrer Entwicklung keine externen Bibliotheken verknüpfen müssen. Sie müssen nur die Bibliothek herunterladen und #include-Makros verwenden, um die Bibliothek zu verwenden. Es vereinfacht die Bereitstellung Ihrer Anwendung auf dem Weg, aber manchmal auf Kosten von längeren Compiler-Zeiten.
Tags und Links c++ templates header-only