Costumo ouvir pessoas dizerem que programadores de C ++ devem expor a API pública de sua biblioteca / produto como uma API C.
O que isso significa e quais são as vantagens disso?
Costumo ouvir pessoas dizerem que programadores de C ++ devem expor a API pública de sua biblioteca / produto como uma API C.
O que isso significa e quais são as vantagens disso?
Respostas:
Isso significa que a parte da sua biblioteca que é exposta como interface usa apenas a "parte" C da linguagem, portanto você não está exportando classes ou similares, apenas funções, PODs e estruturas contendo PODs. Além disso, você precisa desativar o nome do C ++, geralmente obtido pela marcação de funções como extern "C"
. Um exemplo típico seria:
extern "C" void foo(int bar);
A grande vantagem de expor suas bibliotecas dessa maneira é que praticamente todas as linguagens de programação existentes têm um mecanismo para interagir diretamente com uma biblioteca C, mas apenas muito poucas também podem interagir diretamente com uma biblioteca C ++. Portanto, nesse sentido, você escolhe o menor denominador comum para facilitar o uso de sua biblioteca por outras pessoas.
No entanto, lembre-se de que essa é realmente apenas uma estratégia útil se você estiver produzindo uma biblioteca para outras pessoas consumirem. Se você estiver criando um software somente em C ++ e as bibliotecas apenas precisarem interagir entre si, é melhor (IMHO) expor as APIs C ++ apropriadas para que você possa usar todo o poder da linguagem.
extern "C"
coisas que eu não entendi?
.hpp
, mas esta extensão significa "arquivo de cabeçalho C ++", por isso deve ser .h
, que é usado para C e C ++.
Além da resposta do Timo - não há C ++ ABI padronizado para algumas plataformas (por exemplo, Windows - algumas como o Linux do Mac OS X amplamente adotado), portanto, não se trata apenas de falta de recurso, mas da impossibilidade de implementá-lo.
Por exemplo, o IIRC MSVC tem ABI diferente em cada versão e pode mudar dependendo da depuração ou da compilação - e não é publicado, portanto os compiladores de terceiros geralmente não são compatíveis (li algumas informações de que alguma versão do icc é compatível com o MSVC 2005, mas podem ser informações divulgadas pela NDA - não necessárias para criadores do Python) e usar sua própria ABI. Portanto, na prática, o ambiente de linguagem limitaria não apenas a versão do compilador, mas também sinalizadores.
Finalmente, o C ++ possui muito mais recursos em tempo de compilação. Por exemplo, os genéricos geralmente não existem nos idiomas digitados dinamicamente etc.