Le mécanisme extern "C" permet d'interagir avec du code écrit en C. Cela permet d'utiliser des bibliothèques C et facilite la liaison entre C++ et d'autres langages.
Contexte : Depuis le début, le langage C++ a été construit sur la base du C, mais il a ses propres particularités, y compris le 'name mangling', pour supporter la surcharge des fonctions et d'autres fonctionnalités.
Problème : Le nom d'une fonction en C++ est compilé en un symbole avec une structure supplémentaire (mangled), mais en C, cette transformation n'existe pas. Par conséquent, il est impossible de simplement inclure un en-tête de code C dans un compilateur C++ sans efforts supplémentaires.
Solution :
L'encapsulation des fonctions dans la construction extern "C" interdit le 'name mangling', les rendant visibles pour le code compilé par le compilateur C.
Exemple de code :
#ifdef __cplusplus extern "C" { #endif void foo(int); #ifdef __cplusplus } #endif
Caractéristiques clés :
Peut-on surcharger des fonctions avec extern "C" ?
Non, la surcharge n'est pas possible, car il utilise le nom standard C de la fonction.
Que se passera-t-il si une fonction template est déclarée comme extern "C" ?
Erreur de compilation, car les templates sont une fonctionnalité distincte de C++ et ne sont pas prises en charge en C.
Peut-on utiliser extern "C" au niveau d'une classe distincte ?
Non, seulement pour des fonctions et des variables, pas pour des classes ou des méthodes.
Un projet C++ connecte une bibliothèque C tierce sans extern "C", le code ne se linke pas en raison d'une incompatibilité des noms de symboles.
Avantages :
Inconvénients :
Utilisation de extern "C" dans les fichiers d'en-tête lors de l'intégration de bibliothèques C tierces.
Avantages :
Inconvénients :