Implicações do uso de std :: vector em uma função exportada de dll
Eu tenho duas classes exportadas para dll A e B. A declaração de A contém uma função que usa um std :: vector em sua assinatura como:
<code>class EXPORT A{ // ... std::vector<B> myFunction(std::vector<B> const &input); }; </code>
(EXPORT é a macro usual para colocar em prática _declspec (dllexport) /_declspec (dllimport) em conformidade.)
Lendo sobre os problemas relacionados ao uso de classes STL em uma interface DLL, eu entendo em resumo:
Usando std :: vector em uma interface DLL exigiria que todos os clientes dessa DLL fossem compilados com o mesmoversão do mesmo compilador porque os contêineres STL não são binários compatíveis. Pior ainda, dependendo do uso dessa DLL pelos clientes conjuntamente com outras DLLs, a API DLL '' instável '' pode quebrar esses aplicativos cliente quando as atualizações do sistema são instaladas (por exemplo, pacotes Microsoft KB) (realmente?).
Apesar do acima, se necessário, o std :: vector pode ser usado em uma API DLL exportandostd::vector<B>
gostar:
<code>template class EXPORT std::allocator<B>; template class EXPORT std::vector<B>; </code>
no entanto, isso geralmente é mencionado no contexto quando se quer usar std :: vector como ummembro de A (http://support.microsoft.com/kb/168958).
O seguinte artigo de suporte da Microsoft discute como acessar objetos std :: vector criados em uma DLL por meio de um ponteiro ou referência de dentro do executável (http://support.microsoft.com/default.aspx?scid=kb;EN-US; Q172396). A solução acima para usartemplate class EXPORT ...
parece ser aplicável também. No entanto, a desvantagem resumida no primeiro ponto parece permanecer.
Para se livrar completamente do problema, seria necessário quebrar std :: vector e alterar a assinatura demyFunction
, PIMPL etc ..
Minhas perguntas são:
O resumo acima está correto ou eu sinto falta de algo essencial?
Por que a compilação da minha classe 'A' não gera aviso C4251 (a classe 'std :: vector <_Ty>' precisa ter a interface dll para ser usada pelos clientes de ...)? Eu não tenho nenhum aviso de compilador desligado e não recebo nenhum aviso sobre o uso de std :: vector emmyFunction
na classe exportada A (com VS2005).
O que precisa ser feito para exportar corretamentemyFunction
em um? É viável exportar apenasstd::vector<B>
e o alocador de B?
Quais são as implicações de devolver o by-value std :: vector? Assumindo um executável do cliente que tenha sido compilado com um compilador (-version) diferente. O problema persistir ao retornar por valor em que o vetor é copiado? Eu acho que sim. Similarmente para passar std :: vector como referência constante: poderia acessarstd::vector<B>
(que pode ser construído por um executável compilado com um compilador diferente (-version)) leva a problemas dentromyFunction
? Eu acho que sim de novo ..
O último ponto listado acima é realmente a única solução limpa?
Muito obrigado antecipadamente pelo seu feedback.