Que signifie exposer publiquement un code C ++ en tant qu'API C et quels sont les avantages de le faire?

25

J'entends souvent les gens dire que les programmeurs C ++ devraient exposer l'API publique de leur bibliothèque / produit comme une API C.

Qu'est-ce que cela signifie et quels en sont les avantages?

Daniel Ribeiro
la source

Réponses:

44

Cela signifie que la partie de votre bibliothèque qui est exposée en tant qu'interface utilise uniquement la "partie" C du langage, donc vous n'exportez pas de classes ou similaires, uniquement des fonctions, des POD et des structures contenant des POD. De plus, vous devez désactiver la modification du nom C ++, généralement obtenue en marquant les fonctions comme extern "C". Un exemple typique serait:

extern "C" void foo(int bar);

Le gros avantage d'exposer vos bibliothèques de cette manière est que presque tous les langages de programmation ont un mécanisme pour s'interfacer directement avec une bibliothèque C, mais très peu peuvent également s'interfacer directement avec une bibliothèque C ++. Donc, dans ce sens, vous optez pour le plus petit dénominateur commun pour permettre à d'autres personnes d'utiliser facilement votre bibliothèque.

Cependant, gardez à l'esprit que ce n'est vraiment qu'une stratégie utile si vous produisez une bibliothèque pour que d'autres personnes la consomment. Si vous construisez un morceau de logiciel C ++ uniquement et que les bibliothèques n'ont besoin que de s'interfacer, vous (IMHO) feriez mieux d'exposer les API C ++ appropriées afin de pouvoir utiliser toute la puissance du langage.

Timo Geusch
la source
14
Vous devez également faire attention à ne pas exporter les exceptions levées!
James
Voilà une excellente réponse. Pouvez-vous me donner un exemple de extern "C"ce que je n'ai pas obtenu?
Daniel Ribeiro
1
@DanielRibeiro: google juste pour "extern C". Vous trouverez des liens comme celui-ci: stackoverflow.com/questions/1041866/…
Doc Brown
1
@DanielRibeiro, exemple très simple ajouté.
Timo Geusch
1
@DanielRibeiro Il est techniquement possible de continuer à utiliser .hpp, mais cette extension signifie "fichier d'en-tête C ++", donc il devrait l'être .h, qui est utilisé à la fois pour C et C ++.
leemes
8

En plus de la réponse de Timo - il n'y a pas d'ABI C ++ standard pour certaines plates-formes (par exemple Windows - certains comme Linux de Mac OS X largement adopté), il n'est donc pas seulement question de fonctionnalité manquante mais d'impossibilité d'implémenter une telle fonctionnalité.

Par exemple, l'IICRC MSVC a des ABI différents dans chaque version et cela peut changer selon qu'il s'agit d'un débogage ou d'une version publiée - et il n'est pas publié, donc les compilateurs tiers ne sont généralement pas compatibles (j'ai lu certaines informations qu'une version d'icc est compatible avec MSVC 2005 mais il pourrait s'agir d'informations divulguées sous NDA - pas nécessairement disponibles pour les créateurs de Python, par exemple) et utiliser leur propre ABI. Donc, dans la pratique, l'environnement linguistique limiterait non seulement la version du compilateur, mais aussi les drapeaux.

Enfin, C ++ a beaucoup plus de fonctionnalités au moment de la compilation. Par exemple, les génériques n'existent généralement pas dans les langages typés dynamiquement, etc.

Maciej Piechotka
la source
2
@DanielRibeiro: Bienvenue dans le merveilleux enfer de C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ). La version courte est qu'il est très difficile de faire en sorte que les composants C ++ soient compilés séparément (compilés avec différents compilateurs / drapeaux) pour fonctionner ensemble au lieu de tomber en panne / planter en silence.
Maciej Piechotka