ProgrammationDéveloppeur C++

Comment le mécanisme des fonctions externes (extern 'C') est-il implémenté en C++ et à quoi sert-il ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Désactivation du name mangling pour la compatibilité avec C
  • Utilisé pour l'intégration de bibliothèques tierces
  • Ne permet pas la surcharge des fonctions au sein de 'extern "C"'

Questions piégeuses.

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.

Erreurs typiques et anti-patterns

  • Confusion dans le linkage pour différents fichiers
  • Tentatives de surcharge des fonctions avec extern "C"
  • Tentative d'utiliser tout ce qui n'est pas supporté en C dans extern "C" : classes, templates, surcharge

Exemples de la vie réelle

Cas négatif

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 :

  • Permet de travailler avec des bibliothèques tierces (si tout est fait correctement)

Inconvénients :

  • Erreur si l'on oublie le name mangling ; les liens ne se compilent pas

Cas positif

Utilisation de extern "C" dans les fichiers d'en-tête lors de l'intégration de bibliothèques C tierces.

Avantages :

  • Compilation fiable
  • Simplification de la compatibilité

Inconvénients :

  • Pas de surcharge de fonctions