O que significa expor um código C ++ publicamente como uma API C e quais são as vantagens de fazê-lo?

25

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?

Daniel Ribeiro
fonte

Respostas:

44

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.

Timo Geusch
fonte
14
Você deve ter cuidado para não exportar exceções lançadas também!
James
Essa é uma ótima resposta. Você pode me dar um exemplo das extern "C"coisas que eu não entendi?
Daniel Ribeiro
1
@ DanielRibeiro: basta pesquisar no google por "extern C". Você encontrará links como este: stackoverflow.com/questions/1041866/…
Doc Brown
1
@ DanielRibeiro, exemplo muito simples adicionado.
Timo Geusch
1
@DanielRibeiro É tecnicamente possível ainda usar .hpp, mas esta extensão significa "arquivo de cabeçalho C ++", por isso deve ser .h, que é usado para C e C ++.
leemes
8

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.

Maciej Piechotka
fonte
2
@DanielRibeiro: Bem-vindo ao maravilhoso inferno do C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ). A versão curta é que é muito difícil fazer com que componentes C ++ sejam compilados separadamente (compilados com diferentes compiladores / sinalizadores) para trabalharem juntos, em vez de falhar / travar silenciosamente.
Maciej Piechotka