Auswirkungen der Verwendung von std :: vector in einer exportierten DLL-Funktion

Ich habe zwei DLL-exportierte Klassen A und B. Die Deklaration von A enthält eine Funktion, die einen std :: vector in ihrer Signatur verwendet, wie:

<code>class EXPORT A{
 // ...
 std::vector<B> myFunction(std::vector<B> const &input);
};
</code>

(EXPORT ist das übliche Makro _declspec (dllexport) /_declspec (dllimport) entsprechend.)

Ich fasse zusammenfassend die Probleme zusammen, die mit der Verwendung von STL-Klassen in einer DLL-Schnittstelle zusammenhängen:

Wenn Sie std :: vector in einer DLL-Schnittstelle verwenden, müssen alle Clients dieser DLL mit derselben kompiliert werdenAusführung desselben Compilers, da STL-Container nicht binär kompatibel sind. Schlimmer noch, je nachdem, wie diese DLL von Clients gemeinsam mit anderen DLLs verwendet wird, kann die DLL-API '' instable '' diese Clientanwendungen beschädigen, wenn Systemupdates installiert werden (z. B. Microsoft KB-Pakete) (wirklich?).

Trotzdem kann std :: vector bei Bedarf durch Exportieren in eine DLL-API verwendet werdenstd::vector<B> mögen:

<code>template class EXPORT std::allocator<B>;
template class EXPORT std::vector<B>;
</code>

Dies wird jedoch normalerweise im Zusammenhang erwähnt, wenn man std :: vector alsMitglied von A (http://support.microsoft.com/kb/168958).

Der folgende Microsoft Support-Artikel beschreibt den Zugriff auf in einer DLL erstellte std :: vector-Objekte über einen Zeiger oder eine Referenz in der ausführbaren Datei (http://support.microsoft.com/default.aspx?scid=kb;EN-US; Q172396). Die obige Lösung zu verwendentemplate class EXPORT ... scheint auch anwendbar zu sein. Der unter dem ersten Aufzählungspunkt zusammengefasste Nachteil scheint jedoch bestehen zu bleiben.

Um das Problem vollständig zu beseitigen, müsste man std :: vector umbrechen und die Signatur von ändernmyFunction, PIMPL etc ..

Meine Fragen sind:

Ist die obige Zusammenfassung korrekt oder vermisse ich hier etwas Wesentliches?

Warum generiert die Kompilierung meiner Klasse 'A' keine Warnung C4251 (Klasse 'std :: vector <_Ty>' muss über eine DLL-Schnittstelle verfügen, die von Clients von ... verwendet werden kann)? Ich habe keine Compiler-Warnungen deaktiviert und bekomme keine Warnung zur Verwendung von std :: vector inmyFunction in exportierter Klasse A (mit VS2005).

Was muss getan werden, um richtig zu exportieren?myFunction in einem? Ist es möglich, nur zu exportierenstd::vector<B> und der Allokator von B?

Was bedeutet es, std :: vector by-value zurückzugeben? Angenommen, eine Client-Programmdatei wurde mit einem anderen Compiler kompiliert (-version). Bleibt das Problem bestehen, wenn der By-Wert zurückgegeben wird, in den der Vektor kopiert wird? Ich denke ja. Ähnliches gilt für die Übergabe von std :: vector als konstante Referenz: könnte auf zugreifenstd::vector<B> (die möglicherweise von einer ausführbaren Datei erstellt wurde, die mit einem anderen Compiler kompiliert wurde (-version)) führen zu Problemen innerhalb vonmyFunction? Ich denke ja nochmal ..

Ist der letzte oben aufgeführte Aufzählungspunkt wirklich die einzige saubere Lösung?

Vielen Dank im Voraus für Ihr Feedback.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage