C ++ Nur-Header-Vorlagenbibliothek

8

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.

    
flow 01.06.2011, 11:58
quelle

9 Antworten

11

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:

%Vor%

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

    
Nawaz 01.06.2011, 12:01
quelle
4

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.

    
Ernest Friedman-Hill 01.06.2011 12:01
quelle
3

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.

    
Sergei Nikulov 01.06.2011 12:02
quelle
1

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.

    
Diego Sevilla 01.06.2011 12:02
quelle
1

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.

    
James Kanze 01.06.2011 13:11
quelle
0

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

  1. Das Einfügen ist einfacher, da Sie in Ihrem Build-System keine Linker-Optionen angeben müssen.
  2. Sie kompilieren immer den gesamten Bibliothekscode mit dem gleichen Compiler (Optionen) wie der Rest Ihres Codes, da die Funktionen der Bibliothek in Ihren Code integriert werden.
  3. Es kann viel schneller sein.

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.

    
Fred Foo 01.06.2011 12:01
quelle
0

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.

    
Lou Franco 01.06.2011 12:01
quelle
0

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 .

>     
sharptooth 01.06.2011 12:01
quelle
0

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.

    
Dr. Watson 01.06.2011 12:02
quelle

Tags und Links