0Pricing
C++ Academy · Lektion

Extern C und die C-ABI

Stellen Sie aus C++-Bibliotheken mit extern C C-kompatible Schnittstellen bereit.

Extern C und die C-ABI ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Interoperabilität?

C++ verfügt über eine komplexe ABI (Application Binary Interface) mit Namensmangling, Ausnahmen und Templates. Andere Sprachen (C, Python, Rust) können verstümmelte C++-Symbole nicht direkt verwenden.

extern "C"

Schließen Sie Deklarationen in extern "C" ein, um das C++-Namensmangling zu deaktivieren und die C-Aufrufkonvention zu verwenden.

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

Warum die C-ABI?

Die C-ABI ist der kleinste gemeinsame Nenner zwischen Sprachen. Fast jede Sprache kann über FFI C-Funktionen aufrufen.

Muster für Header-Dateien

Machen Sie einen Header mit einem bedingten extern "C" sowohl aus C als auch aus C++ verwendbar.

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

Was Sie nicht exportieren können

Einige C++-Funktionen haben kein Gegenstück in C:

  • Klassen (C kennt kein Klassenkonzept)
  • Templates (werden zur Kompilierzeit aufgelöst und können nicht exportiert werden)
  • Überladene Funktionen (ohne Namensmangling gibt es keine Überladung)
  • Ausnahmen (müssen vor dem Überschreiten der FFI-Grenze abgefangen werden)

Eine Klasse verfügbar machen

Verbergen Sie die Klasse hinter opaken Zeigern und einer C-ähnlichen API.

// 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); }
}

Ausnahmen über FFI vermeiden

Ausnahmen, die aus einer über C aufgerufenen C++-Funktion ausgelöst werden, führen zum Abbruch. Fangen Sie sie an der Grenze ab.

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

Speicherbesitz

Dokumentieren Sie, wem was gehört — normalerweise gibt die Seite den Speicher frei, die ihn allokiert. Unstimmigkeiten führen zu Leaks oder doppelter Freigabe.

Strings über FFI

std::string gibt es nur in C++. Überqueren Sie die FFI-Grenze als const char*. Entscheiden Sie, ob der Empfänger eine Kopie erstellt, und dokumentieren Sie die Lebensdauer.

Structs über FFI

Verwenden Sie POD-Strukturen (Plain Old Data), die in C und C++ dasselbe Layout haben. Vermeiden Sie virtuelle Funktionen, Referenzen und std-Typen.

Callbacks

Übergeben Sie Funktionszeiger (oder void* plus Funktionszeiger) über FFI. Stellen Sie für Closures einen Kontextzeiger bereit.

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

Linkage und Header

extern "C" wirkt sich nur auf die Linkage aus, nicht auf das Verhalten. Die Funktion wird weiterhin intern als C++ kompiliert, kann aber von außen als C aufgerufen werden.

Kurztest

Warum schließen Sie C++-Funktionen in extern "C" ein, wenn Sie sie für andere Sprachen verfügbar machen?

Zusammenfassung

extern "C" verleiht einer Funktion C-Linkage — kein Namensmangling und die C-Aufrufkonvention. Verwenden Sie es, um C++ über FFI für andere Sprachen verfügbar zu machen. Verbergen Sie Klassen hinter opaken Zeigern, fangen Sie Ausnahmen an der Grenze ab und dokumentieren Sie die Besitzverhältnisse eindeutig.

Häufig gestellte Fragen

Ist die Lektion „Extern C und die C-ABI“ kostenlos?

Ja — der vollständige Text von „Extern C und die C-ABI“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Extern C und die C-ABI“?

Stellen Sie aus C++-Bibliotheken mit extern C C-kompatible Schnittstellen bereit. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Extern C und die C-ABI“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Extern C und die C-ABI
  2. Python aus C++ über pybind11 aufrufen
  3. C++ für Rust-FFI-Grenzen
  4. SWIG für sprachübergreifende Bindings verwenden
← Zurück zu C++ Academy