Was ist die beste Erklärung für das Schlüsselwort export im C ++ 0x-Standard?
Ich weiß, dass in der ursprünglichen C++0x-standard-gab es ein feature namens export
.
Aber ich kann nicht finden, eine Beschreibung oder Erklärung dieser Funktion. Was soll es tun? Auch: welche compiler unterstützt es?
InformationsquelleAutor der Frage zerbp | 2008-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl Standard-C++ hat keine solche Anforderung, einige Compiler verlangen, dass die Funktion alle Vorlagen zur Verfügung gestellt werden müssen in jeder übersetzungseinheit, dass es verwendet wird. Im Effekt, für diejenigen, die Compiler, die Körper der template-Funktionen verfügbar gemacht werden muss in einer header-Datei. Wiederholen: das heißt, dass diese Compiler wird nicht zulassen, dass Sie definiert werden, in nicht-header-Dateien wie .cpp-Dateien. Um zu klären, in C++ese dies bedeutet, dass diese:
wäre NICHT zufrieden mit diesen Definitionen der ctor und dtors:
weil, es verwendend:
wird ein Fehler erzeugt. Zum Beispiel, mit der Comeau C++ Sie bekommen würde:
weil es keine Nutzung der ctor bzw. dtor innerhalb xyz.cpp daher gibt es keine Instanzen, die Bedürfnisse von auftreten es. Für besser oder schlechter, das ist, wie Vorlagen arbeiten.
Ein Weg, um dieses ist, die explizit anfordern, die Instanziierung von
xyz
in diesem Beispiel vonxyz<int>
. In einem brute-force-Aufwand, könnte dies Hinzugefügt werden xyz.cpp durch hinzufügen dieser Zeile am Ende von:die Anforderungen, die (alle)
xyz<int>
instanziiert werden. Das ist irgendwie an der falschen Stelle, aber, da es bedeutet, dass jedes mal wenn ein neuer xyz-Typ hervorgerufen wird, dass die Umsetzung-Datei xyz.cpp geändert werden müssen. Eine weniger aufdringliche Art und Weise zu vermeiden, dass die Datei zu erstellen weitere:Dies ist immer noch etwas schmerzhaft, weil es immer noch erfordert einen manuellen Eingriff jedes mal wenn ein neuer xyz hervorgebracht. In einem nicht-trivialen Programm dies könnte eine unangemessene Wartung Bedarf.
Also stattdessen einen anderen Weg, dies zu nähern, ist
#include "xyz.cpp"
in das Ende von xyz.h:Natürlich könnten Sie buchstäblich bringen (Ausschneiden und einfügen) den Inhalt der xyz.cpp am Ende von xyz.h, daher loszuwerden xyz.cpp; es ist eine Frage, die Organisation von Dateien und am Ende die Ergebnisse der Vorverarbeitung werden die gleichen sein, dass der ctor und dtor Körper wird in der Kopfzeile, und damit brachte in jede Zusammenstellung verlangen, denn das wäre mit der jeweiligen Kopfzeile. So oder so, das hat die Nebenwirkung, dass nun jedes template ist in Ihrem header-Datei. Es könnte langsam compilation, und es könnte result in code aufblähen. Ein Weg der Annäherung an den letzteren ist zu erklären, dass die Funktionen in Frage, in diesem Fall die ctor und dtor, als inline -, so würde das verlangen, Sie zu ändern xyz.cpp in dem ausgeführten Beispiel.
Nebenbei einige Compiler verlangen auch, dass einige Funktionen inline definiert, die in einer Klasse, und nicht in der Außenwelt, so dass das setup oben würde müssen weiter optimiert werden bei den Compilern. Beachten Sie, dass dies ist ein compiler-Problem, nicht eines der Standard-C++, so dass nicht alle Compiler verlangen dies. Zum Beispiel, Comeau C++ nicht, noch sollte es. Check-out http://www.comeaucomputing.com/4.0/docs/userman/ati.html für details zu unseren aktuellen setup. In kurzen, Comeau C++ unterstützt viele Modelle, darunter eine, die kommt nah an, was die export-Schlüsselwort Absichten sind (als Erweiterung) sowie auch Unterstützung der export selbst.
Schließlich, beachten Sie, dass die C++ - export-Schlüsselwort ist für die Linderung der ursprünglichen Frage. Derzeit werden jedoch, Comeau C++ ist der einzige compiler ist, öffentlich bekannt gemacht, um Unterstützung zu exportieren. Sehen http://www.comeaucomputing.com/4.0/docs/userman/export.html und http://www.comeaucomputing.com/4.3.0/minor/win95+/43stuff.txt für einige details. Hoffentlich als anderen Compilern reach compliance mit C++ - Standard, an dieser situation ändern wird. Im obigen Beispiel mit export bedeutet die Rückkehr zu den original-code erzeugt der linker-Fehler, und eine Veränderung: deklarieren Sie die Vorlage in xyz.h mit der export-Schlüsselwort:
Den ctor und dtor in xyz.cpp exportiert werden Sie einfach von Tugend von #includeing xyz.h, was es bereits tut. Also, in diesem Fall brauchen Sie nicht xyztir.cpp noch die Instanziierung am Ende xyz.cpp und Sie brauchen nicht die ctor bzw. dtor manuell in xyz.h. Mit der Kommandozeile, wie oben gezeigt, ist es möglich, dass der compiler alles für Sie automatisch.
InformationsquelleAutor der Antwort
Sehen diese Erklärung für seine Verwendung
Ganz wenigen Compilern nicht unterstützt, entweder weil es zu neu ist oder-im Falle der gcc - weil Sie disaprove.
Dieser Beitrag beschreibt standard-Unterstützung für viele Compiler.
Visual Studio-Unterstützung für neue C /C++ - standards?
InformationsquelleAutor der Antwort Martin Beckett
Sehen hier und hier für Herb Sutter ' s Behandlung des Themas.
Grundsätzlich gilt: der export wurde implementiert, nur ein compiler - und in dieser Umsetzung, export tatsächlich erhöht die Kopplung zwischen den template-definition und Erklärung, in der Erwägung, dass der einzige Punkt bei der Einführung von export war eine Verringerung dieser Kopplung.
Dass ist der Grund, warum die meisten Compiler nicht stören. Ich hätte gedacht, Sie würden gerade entfernt haben, exportieren Sie von der Sprache C++0x, aber ich glaube nicht, dass Sie es Tat. Vielleicht wird es eines Tages ein guter Weg, um zu implementieren, die exportieren, hat die beabsichtigte Verwendung.
InformationsquelleAutor der Antwort Greg Rogers
Um es einfach auszudrücken:
export
können Sie die separate Erklärung (dh. header) aus der definition (dh. der code), wenn Sie schreiben, Ihre template-Klassen. Wennexport
wird nicht unterstützt von Ihrem compiler dann müssen Sie legen Sie die Deklaration und definition in einem.InformationsquelleAutor der Antwort Rodyland
Exportieren ist eine Funktion, die führt eine zirkuläre Abhängigkeit zwischen linker und compiler. Wie andere erwähnt, ermöglicht es eine übersetzungseinheit enthalten die definition einer Vorlage in einem anderen verwendet wird. Der linker wird der erste sein, um dies zu erkennen, muss aber der compiler bei der Instanziierung der Vorlage. Und dazu gehört echt harte Arbeit, wie name-lookup.
Comeau führte Sie zunächst über 5 Jahre her IIRC. Es klappte auch ganz gut auf die erste beta-Version, die ich habe. Auch testcases wie Ein<2> mit B<2> mit<1> mit B<1> mit<0>, arbeitete, wenn die Vorlagen A und B kamen aus verschiedenen TU das. Sicher, der linker wurde wiederholt aufrufen des Compilers, sondern alle name-lookups arbeitete OK. Die Instanziierung von A<1> gefundenen Namen aus A.cpp dass die unsichtbar waren, in B.cpp.
InformationsquelleAutor der Antwort MSalters
Standard-Features Fehlen die VC++ 7.1. Teil II: export
InformationsquelleAutor der Antwort Nemanja Trifunovic
Nur Compiler, die Unterstützung exportierte Vorlagen im moment (soweit ich weiß) sind Comeau, die eine, die kam mit dem Borland C++ Builder X, aber nicht in der aktuellen C++ Builder und Intel (zumindest inoffiziell, wenn auch nicht offiziell, nicht sicher).
InformationsquelleAutor der Antwort KTC