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
}
#endifChe 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
- extern C e ABI C
- Chiamare Python da C++ con pybind11
- C++ per i confini FFI con Rust
- Usare SWIG per binding multilingua