C++ Academy · Leçon

Extern C et ABI du C

Exposer des interfaces compatibles avec le C depuis des bibliothèques C++ avec extern C

Leçon 1 sur 414 étapes

Extern C et ABI du C est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.

Pourquoi l'interopérabilité ?

Le C++ possède une ABI complexe (interface binaire d'application), avec décoration des noms, exceptions et modèles. Les autres langages (C, Python, Rust) ne peuvent pas utiliser directement les symboles C++ dont les noms ont été décorés.

extern "C"

Entourez les déclarations de extern "C" pour désactiver la décoration des noms C++ et utiliser la convention d'appel de C.

extern "C" {
    void greet(const char* name);
    int add(int a, int b);
}

Pourquoi l'ABI de C ?

L'ABI de C est le plus petit dénominateur commun entre les langages. Presque tous les langages peuvent appeler des fonctions C via la FFI.

Modèle de fichier d'en-tête

Rendez un fichier d'en-tête utilisable à la fois depuis C et C++ avec un extern "C" conditionnel.

#ifdef __cplusplus
extern "C" {
#endif

void hello(void);
int sum(int a, int b);

#ifdef __cplusplus
}
#endif

Ce que vous ne pouvez pas exporter

Certaines fonctionnalités C++ n'ont pas d'équivalent en C :

  • Classes (C ne possède pas de concept de classe)
  • Modèles (résolus lors de la compilation et non exportables)
  • Fonctions surchargées (sans décoration des noms, pas de surcharge)
  • Exceptions (elles doivent être interceptées avant de franchir la FFI)

Exposer une classe

Masquez la classe derrière des pointeurs opaques et une API de style C.

// header (C visible)
typedef struct Widget Widget;
Widget* widget_create(int x);
void    widget_destroy(Widget*);
int     widget_value(const Widget*);

// .cpp
class WidgetImpl { /* ... */ };
extern "C" {
    Widget* widget_create(int x) { return reinterpret_cast<Widget*>(new WidgetImpl(x)); }
    void widget_destroy(Widget* w) { delete reinterpret_cast<WidgetImpl*>(w); }
}

Éviter les exceptions à travers la FFI

Une exception levée par une fonction C++ appelée via C provoquera un abandon. Interceptez-la à la frontière.

extern "C" int safe_call() {
    try {
        risky();
        return 0;
    } catch (...) {
        return -1;
    }
}

Propriété de la mémoire

Documentez qui possède quoi : en général, le côté qui alloue libère. Les incohérences entraînent des fuites ou des doubles libérations.

Chaînes de caractères à travers la FFI

std::string est propre au C++. Traversez la FFI avec const char*. Décidez si le récepteur effectue une copie et documentez la durée de vie.

Structures à travers la FFI

Utilisez des structures POD (données simples) qui ont la même organisation en C et en C++. Évitez les fonctions virtuelles, les références et les types de la bibliothèque standard.

Fonctions de rappel

Transmettez des pointeurs de fonction (ou void* associés à un pointeur de fonction) à travers la FFI. Fournissez un pointeur de contexte pour les fermetures.

extern "C" {
    typedef void (*Callback)(int value, void* user_data);
    void register_callback(Callback cb, void* user_data);
}

Liaison et fichiers d'en-tête

Le extern "C" ne concerne que la liaison, pas le comportement. La fonction est toujours compilée comme du C++ à l'intérieur, mais peut être appelée comme une fonction C depuis l'extérieur.

Vérification rapide

Pourquoi entourer les fonctions C++ de extern "C" lorsqu'on les expose à d'autres langages ?

Récapitulatif

extern "C" donne à une fonction une liaison C : aucune décoration des noms et convention d'appel de C. Utilisez-le pour exposer du C++ à d'autres langages via la FFI. Masquez les classes derrière des pointeurs opaques, interceptez les exceptions à la frontière et documentez clairement la propriété de la mémoire.

Gratuit pour commencer

Apprends C++ avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
51
Leçons
203

Questions Fréquemment Posées

La leçon « Extern C et ABI du C » est-elle gratuite ?

Oui — le texte complet de « Extern C et ABI du C » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Extern C et ABI du C » ?

Exposer des interfaces compatibles avec le C depuis des bibliothèques C++ avec extern C Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C++ Academy ?

Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Extern C et ABI du C » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?

Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Extern C et ABI du C
  2. Appeler Python depuis C++ avec pybind11
  3. C++ pour les frontières FFI de Rust
  4. Utiliser SWIG pour des liaisons multilingues
← Retour à C++ Academy