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?
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?
Réponses:
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.
extern "C"
ce que je n'ai pas obtenu?
.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 ++.
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.