0Pricing
C++ Academy · Lezione

extern C e ABI C

Esponga interfacce compatibili con C dalle librerie C++ usando extern C

extern C e ABI C è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Perché l'interoperabilità

Il C++ ha un'ABI (Application Binary Interface) complessa, con name mangling, eccezioni e template. Gli altri linguaggi (C, Python, Rust) non possono utilizzare direttamente i simboli C++ soggetti a name mangling.

extern "C"

Racchiudete le dichiarazioni in extern "C" per disabilitare il name mangling del C++ e utilizzare la convenzione di chiamata del C.

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

Perché l'ABI del C

L'ABI del C è il minimo comune denominatore tra i linguaggi. Quasi ogni linguaggio può chiamare funzioni C tramite FFI.

Struttura del file header

Rendete un header utilizzabile sia dal C sia dal C++ con un extern "C" condizionale.

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

Che cosa non potete esportare

Alcune funzionalità del C++ non hanno un equivalente in C:

  • Classi (in C non esiste il concetto di classe)
  • Template (risolti in fase di compilazione, non esportabili)
  • Funzioni sovraccaricate (senza name mangling non è possibile il sovraccarico)
  • Eccezioni (devono essere catturate prima di attraversare la FFI)

Esporre una classe

Nascondete la classe dietro puntatori opachi e un'API in stile 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); }
}

Evitate le eccezioni attraverso la FFI

Le eccezioni lanciate da una funzione C++ chiamata tramite C causano l'interruzione del programma. Catturatele al confine.

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

Proprietà della memoria

Documentate chi è responsabile di ogni risorsa: di norma, chi alloca è anche responsabile della deallocazione. Le incoerenze causano memory leak o double free.

Stringhe attraverso la FFI

std::string è specifico del C++. Attraverso la FFI utilizzate const char*. Stabilite se il destinatario crea una copia e documentate il ciclo di vita.

Struct attraverso la FFI

Utilizzate struct POD (plain old data) che abbiano lo stesso layout in C e C++. Evitate funzioni virtuali, riferimenti o tipi std.

Callback

Passate puntatori a funzione (oppure void* + puntatore a funzione) attraverso la FFI. Fornite un puntatore di contesto per le closure.

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

Linkage e header

extern "C" influisce solo sul linkage, non sul comportamento. La funzione viene comunque compilata come C++ all'interno, ma dall'esterno può essere chiamata come funzione C.

Verifica rapida

Perché racchiudere le funzioni C++ in extern "C" quando le si espone ad altri linguaggi?

Riepilogo

extern "C" assegna a una funzione il linkage del C: niente name mangling e convenzione di chiamata del C. Utilizzatelo per esporre il C++ ad altri linguaggi tramite FFI. Nascondete le classi dietro puntatori opachi, catturate le eccezioni al confine e documentate chiaramente la proprietà delle risorse.

Domande Frequenti

La lezione «extern C e ABI C» è gratuita?

Sì — il testo completo di «extern C e ABI C» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «extern C e ABI C»?

Esponga interfacce compatibili con C dalle librerie C++ usando extern C Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «extern C e ABI C»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. extern C e ABI C
  2. Chiamare Python da C++ con pybind11
  3. C++ per i confini FFI con Rust
  4. Usare SWIG per binding multilingua
← Torna a C++ Academy