C est l’une des langues les plus anciennes qui existe encore. Son ABI est simple et pratiquement tous les systèmes d’exploitation encore utilisés aujourd’hui y ont été écrits . Certains de ces systèmes d’exploitation peuvent avoir ajouté des éléments, par exemple en C # / .NET ou autre, mais en-dessous, ils sont très imprégnés de C.
Cela signifie que, pour utiliser les fonctionnalités fournies par le système d'exploitation, pratiquement tous les langages de programmation existants avaient besoin d'un moyen d'interface avec les bibliothèques C de toute façon . Perl, Java, C ++, ils fournissent tous nativement des moyens de "parler C", car ils devaient le faire s'ils ne voulaient pas réinventer chaque roue.
Cela fait de C le latin des langages de programmation. (Combien d'années d'internet avant cette métaphore doit être "l'anglais des langues de progamming"?)
Lorsque vous écrivez votre bibliothèque en C, vous bénéficiez d’une interface gratuite (évidemment). Si vous écrivez votre bibliothèque en C ++, vous pouvez obtenir des liaisons en C, via des extern "C"
déclarations comme vous l'avez mentionné.
Cependant , vous pouvez obtenir ces liaisons que pour des fonctionnalités qui peuvent être exprimées en C .
Donc, votre API de bibliothèque ne peut pas utiliser ...
- des modèles,
- Des classes,
- exceptions,
- toute fonction prenant ou retournant des objets.
Un exemple simple, vous auriez besoin que vos fonctions exportées prennent et renvoient arrays ( []
) à la place de std::vector
(ou std::string
d'ailleurs).
Ainsi, non seulement vous ne seriez pas en mesure de fournir les avantages de C ++ aux clients de votre bibliothèque, mais vous devrez également déployer des efforts supplémentaires pour "traduire" votre API de bibliothèque de C ++ en "compatible C" ( extern "C"
).
C’est pourquoi on pourrait faire valoir que C est le meilleur choix pour la mise en place d’une bibliothèque. Personnellement, je pense que les avantages du C ++ l'emportent toujours sur les efforts nécessaires pour une extern "C"
API, mais ce n'est que moi.