C++ Kurs

Wenn fertig, bitte Fenster schließen

extern "C" Speicherklasse

Und noch eine Anwendung für die Speicherklasse extern. Eine besondere Form der extern-Anweisung ist die Anweisung extern "C". Wollen Sie von einem C++ Programm aus auf Funktionen zugreifen, die mit einem C-Compiler (nicht C++ Compiler!) übersetzt worden sind, so müssen Sie diese Funktionen als extern "C" Funktionen kennzeichnen.


// Deklaration einer C-Funktion die von einem C++ Programm aufgerufen wird
extern "C" void MyCFunc(...);

// Deklarationen für mehrere C-Funktionen
extern "C"
{
   void MyCFunc1(..);
   short MyCFunc2(..);
}

Der Grund hierfür ist, dass ein C++ Compiler als Symbolname für eine Funktion nicht nur (wie ein C-Compiler) den Funktionsnamen alleine verwendet, sondern auch noch die Funktionsparameter mit in den Symbolnamen einbaut. Dieses Verhalten des C++ Compilers wird auch als name mangeling bezeichnet. Durch die Anweisung extern "C" weisen Sie den C++ Compiler nun an, als Symbolname für die Funktion auch nur den Funktionsnamen zu verwenden, genauso wie es der C-Compiler tut. Warum der C++ Compiler auch die Parameter noch mit auswertet, das erfahren Sie später beim Überladen von Funktionen.

Haben Sie mehrere C-Funktionen geschrieben, die Sie sowohl unter C wie auch unter C++ einsetzen wollen, so werden Sie in der Regel die Deklarationen der Funktionen in einer Header-Datei zusammenfassen. Damit die C-Funktionen auch von C++ aus aufrufbar sind, müssen Sie in der Header-Datei auch als extern "C" Funktionen deklariert werden (wie bereits erwähnt).

Wird diese Header-Datei nun aber von einem C-Compiler eingelesen, so gibt dieser eine Fehlermeldung aus, da er die extern "C" Anweisung nicht kennt. Sie könnten nun getrennte Header-Dateien für den C und C++ Compiler erstellen, was aber irgendwann zu Wartungsproblemen führen wird, da Sie immer beide Header-Dateien gleichzeitig bearbeiten müssen. Im Beispiel unten  sehen Sie eine der Lösungen dieses Problems. Ein C++ Compiler definiert ein internes Symbol mit dem Namen __cplusplus (2 Underscores am Anfang!). Und dieses Symbol können Sie wie unten dargestellt mittels #ifdef...#endif abfragen um so bedingt die extern "C" Anweisung einzubinden. Die Anweisungen #ifdef...#endif werden gleich noch bei den Präprozessor-Anweisungen ausführlich behandelt.


#ifdef __cplusplus
extern "C"
{
#endif
   ... // Hier stehen die Funktionsdeklarationen
#ifdef __cplusplus
}
#endif