Frage C ++ Header-Only-Vorlagenbibliothek


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 für dieses Projekt verwenden


8
2018-06-01 11:58


Ursprung


Antworten:


Das bedeutet, dass alle Definitionen der Vorlage (Funktionsvorlage oder Klassenvorlage) nur in den Kopfzeilen enthalten sind. Es gibt kein .cpp Datei. Es sind nur .h Dateien (oder einige andere Erweiterungen wie .hpp oder überhaupt keine Verlängerung mögen <vector>, string> etc)

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. Es ist 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 den Teil der C ++ - Standardbibliothek, der Vorlagen wie z <vector>, string>, <map>usw. ist eine Nur-Header-Bibliothek.

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. es ist nur dann, wenn Sie es in Ihrem Code verwenden, der Vorlageargument (s) übergibt (das ist entweder type oder value), generiert der Compiler eine kompilierbare Funktion / Klasse aus der Funktion / Klassenvorlage:

template<typename T>
struct A
{
   T data;
};

struct B
{
   int data;
};

Hier, A kann nicht in Binärdateien kompiliert werden (statische Bibliothek oder dynamische Bibliothek), weil der Compiler nicht weiß was T ist. Aber B kann in binär kompiliert werden, da der Compiler vollständige Informationen darüber hat.

So können Sie den Ausdruck lesen "Klassenvorlage A" wie : A ist eine Vorlage für eine Klasse. A selbst ist keine Klasse. Aber B ist eine Klasse, es ist keine Vorlage.

Als die Klassenvorlage A kann nicht in statische oder dynamische Bibliothek kompiliert werden, um mit Ihren Programmen verknüpft zu werden A kann nur als verschickt werden header-only Bibliothek mit vollem Quellcode. Gleichfalls


11
2018-06-01 12:01



Einige Bibliotheken haben die Form einer Binärdatei, die Sie mit Ihrem Projekt verknüpfen müssen, zusammen mit einer Headerdatei, die die verfügbaren Klassen oder Funktionen definiert. Eine "Nur-Header-Bibliothek" wäre eine, die keine Binärdatei enthält, sondern nur eine Kopfzeile, die Sie in Ihre Quelle aufnehmen.

Vorlagen sind Klassen oder Funktionen, die auf ihre spezielle Verwendung zugeschnitten 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, sodass Sie die Quelle zusammen mit Ihrem eigenen Code einschließen und der Compiler sie dann zusammen verarbeiten kann.


4
2018-06-01 12:01



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.


3
2018-06-01 12:02



Die kurze Antwort ist, dass Vorlagen ähnlich wie Makros für den Compiler sind, um Code zu generieren. Jedes Mal, wenn Sie es instanziieren (zum Beispiel mit einem Typ wie std::list<int>) muss der Compiler den Originalcode haben, um den korrekten Typ einzufügen (in diesem Fall) int) im Code der Template-Klasse. Aus diesem Grund sind Template-Klassen enthalten .h Dateien jedes Mal, wenn Sie sie verwenden müssen .cpp Dateien.


1
2018-06-01 12:02



Dies bedeutet, dass der gesamte Code in Headerdateien enthalten 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 selber.


1
2018-06-01 13:11



Dies bedeutet, dass in der Bibliothek keine Module vorhanden sind, sondern 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 Einbinden ist einfacher, da Sie in Ihrem Build-System keine Linker-Optionen angeben müssen.
  2. Sie kompilieren immer den gesamten Bibliothekscode mit demselben Compiler (Optionen) wie der Rest Ihres Codes, da die Funktionen der Bibliothek in Ihrem Code inline werden.
  3. Es kann viel schneller sein.

In diesem Fall wurde die Container-Datenstruktur basierend auf dem Typ der darin enthaltenen Daten implementiert, sodass sie nicht vollständig kompiliert werden kann.


0
2018-06-01 12:01



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 für einen bestimmten Typ instanziiert zu werden. Es gibt nichts, was in eine Bibliothek eingefügt werden kann, es sei denn, die Bibliothek wird vorinstanzierte Versionen bereitstellen oder es gibt einen Teil der Vorlagenbibliothek, der nicht als Vorlage dienen muss.


0
2018-06-01 12:01



Es ist "nur Kopfzeile", weil es keine separaten .cpp-Dateien, nur .h-Dateien enthält und so können Sie einfach #include der gesamte Bibliothekscode in Ihren Code ein.

Dies kann vorteilhaft sein, da Sie keine Verbindung zu einer statischen Bibliothek herstellen müssen was sehr schmerzhaft sein kann.


0
2018-06-01 12:01



Das 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 der Straße, aber manchmal auf Kosten von längeren Compiler-Zeiten.


0
2018-06-01 12:02