Uma biblioteca C ++ 11 compilada (lib, dll, etc.) Pode ser vinculada em compiladores C ++ mais antigos?

12

Os compiladores C ++ mais antigos (por exemplo, VS2008 e gcc3.4) poderiam se vincular a bibliotecas externas escritas em C ++ 11?

Meu pensamento é que os arquivos .lib do C ++ 11 são apenas um código de bytes neste estágio, e não deve incomodar os compiladores mais antigos como eles foram gerados, desde que sejam de alguma forma solucionáveis ​​e acessíveis.

Estou desenvolvendo uma pequena biblioteca cuja API ainda deve suportar usuários do C ++ 03. Então, olhando para a frente, estou me perguntando se não há problema em implementar minha biblioteca usando recursos úteis como std::unique_ptresses, ou devo apenas continuar boost::?

Konafa
fonte

Respostas:

10

Desde que sua biblioteca use apenas C ++ 11 em sua implementação e não exponha recursos ou tipos de C ++ 11 publicamente, e especialmente se você usar ligação estática, sim, isso é possível e até padrão.

Considere o caso comum em que uma biblioteca expõe uma interface de nível C (para ser usada pela maior variedade de clientes), mas que é implementada internamente no C ++. Os clientes vinculados a essa biblioteca precisam apenas se preocupar com a API binária pública (funções exportadas), que você restringiu a ser C / C ++ herdado para obter compatibilidade máxima. Um programa Java pode vincular-se a APIs de nível C que são implementadas internamente em C ++. Isso não significa que o Java precise "suportar C ++". Da mesma forma, um cliente C / C ++ à moda antiga pode vincular-se a uma API no nível C ou C ++, que internamente usa alguma versão mais avant-garde das bibliotecas C ++ ou quaisquer outras bibliotecas. Duas coisas distintas: o que é necessário para vincular à interface da biblioteca e o que a própria biblioteca vincula internamente (ou extrai estaticamente).

Você simplesmente não expõe os clientes da sua biblioteca às dependências da sua implementação.

Se você pode vincular estaticamente suas dependências (C ++ 11 ou qualquer outra coisa) à sua biblioteca, isso é limpo e independente. A biblioteca é uma verdadeira caixa preta: nada além de código de código. Porém, mesmo que sua biblioteca se vincule a suas dependências por meio de uma ligação "dinâmica implícita" (para não confundir com o tipo explícito LoadLibrary / GetProcAddress e os métodos semelhantes no * nix e OS X), os clientes mais antigos ainda deverão poder se conectar aos interface pública, mesmo que não pudessem vincular às bibliotecas das quais a biblioteca depende .

jdevlin
fonte
1
Ótimo! Era exatamente o que eu estava esperando. Não pretendo usar o C ++ 11 extensivamente, mas é bom saber que eu poderia inserir uma função lambda ou duas na minha implementação oculta, quando conveniente. As analogias C e Java fazem sentido. Obrigado.
Konafa 28/08/12
4

Parece que você deseja escrever uma nova biblioteca para uso de outras pessoas e que gostaria de usar o C + 11 como sua linguagem de implementação. Há vários problemas a serem considerados:

  • introduzindo uma nova versão do C ++, você apresentará a necessidade de implantar as novas bibliotecas de tempo de execução do C ++ com sua biblioteca, está bem?
  • você não deve usar novos tipos de C + 11 em sua interface pública, caso contrário eles não poderão chamá-lo.
  • Em geral, você deve evitar tipos complexos, como unique_ptr, vetor par, etc. A menos que esteja distribuindo sua biblioteca como código-fonte, o layout dos objetos em sua biblioteca pode ser diferente do layout no código do cliente. Atenha-se a tipos simples que não correm risco de variações no layout do objeto.
Phillip Ngan
fonte