Implikacje użycia std :: vector w funkcji eksportowanej dll
Mam dwie klasy eksportowane przez dll A i B. Deklaracja A zawiera funkcję, która używa sygnatury std :: vector w następujący sposób:
<code>class EXPORT A{ // ... std::vector<B> myFunction(std::vector<B> const &input); }; </code>
(EXPORT to zwykłe makro, które należy umieścić _declspec (dllexport) /_declspec (dllimport) odpowiednio.)
Czytając o problemach związanych z używaniem klas STL w interfejsie DLL, zbieram podsumowanie:
Użycie std :: vector w interfejsie DLL wymagałoby skompilowania wszystkich klientów tej biblioteki DLL z tym samymwersja tego samego kompilatora, ponieważ kontenery STL nie są kompatybilne binarnie. Co gorsza, w zależności od użycia tej biblioteki DLL przez klientów wspólnie z innymi bibliotekami DLL, interfejs API „niestabilny” może złamać te aplikacje klienckie po zainstalowaniu aktualizacji systemu (np. Pakietów KB firmy Microsoft) (naprawdę?).
Pomimo powyższego, jeśli jest to wymagane, std :: vector może zostać użyty w API DLL poprzez eksportstd::vector<B>
lubić:
<code>template class EXPORT std::allocator<B>; template class EXPORT std::vector<B>; </code>
jest to jednak zazwyczaj wymieniane w kontekście, gdy użytkownik chce użyć std :: vector jako aczłonek z A (http://support.microsoft.com/kb/168958).
Poniższy artykuł pomocy technicznej firmy Microsoft omawia sposób uzyskiwania dostępu do obiektów std :: vector utworzonych w bibliotece DLL za pomocą wskaźnika lub odwołania z poziomu pliku wykonywalnego (http://support.microsoft.com/default.aspx?scid=kb;EN-US; Q172396). Powyższe rozwiązanie do użyciatemplate class EXPORT ...
wydaje się, że ma również zastosowanie. Jednakże wada podsumowana w pierwszym punkcie wydaje się pozostać.
Aby całkowicie pozbyć się problemu, należałoby zawinąć std :: vector i zmienić sygnaturęmyFunction
, PIMPL itp ..
Moje pytania to:
Czy powyższe podsumowanie jest poprawne, czy brakuje mi tutaj czegoś istotnego?
Dlaczego kompilacja mojej klasy „A” nie generuje ostrzeżenia C4251 (klasa „std :: vector <_Ty>” musi mieć interfejs dll do użycia przez klientów…)? Nie mam wyłączonych ostrzeżeń kompilatora i nie otrzymuję żadnego ostrzeżenia na temat używania std :: vector wmyFunction
w wyeksportowanej klasie A (z VS2005).
Co należy zrobić, aby poprawnie wyeksportowaćmyFunction
w? Czy można eksportowaćstd::vector<B>
i rozdzielacz B?
Jakie są implikacje zwracania wartości std :: vector według wartości? Zakładając plik wykonywalny klienta skompilowany z innym kompilatorem (-version). Czy problem powtarza się, gdy zwracana jest wartość-wartość, gdy wektor jest kopiowany? Chyba tak. Podobnie do przekazywania std :: vector jako stałej referencji: może uzyskać dostęp dostd::vector<B>
(co mogło być skonstruowane przez plik wykonywalny skompilowany z innym kompilatorem (-version)) prowadzi do kłopotów wewnątrzmyFunction
? Chyba znowu tak ..
Czy ostatni punkt wymieniony powyżej naprawdę jest jedynym czystym rozwiązaniem?
Z góry dziękuję za Waszą opinię.