Wenn fertig, bitte Fenster schließen

extern "C" Speicherklasse

Eine besondere Form der extern-Anweisung ist die Anweisung extern "C". Soll in einem C++ Programm auf Funktionen zugegriffen werden, die mit einem C-Compiler (nicht C++ Compiler!) übersetzt worden sind, so müssen diese Funktionen als extern "C" Funktionen gekennzeichnet werden.

PgmHeader
// Deklaration einer C-Funktion die von einem C++ Programm aufgerufen werden soll
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 Datentypen der Funktionsparameter mit in den Symbolnamen einbaut. Dieses Verhalten des C++ Compilers wird auch als name mangeling bezeichnet. Durch die Anweisung extern "C" wird der C++ Compiler nun angewiesen, als Symbolname für die Funktion auch nur den Funktionsnamen zu verwenden, genauso wie es ein C-Compiler tut. Warum der C++ Compiler auch die Parameter noch mit auswerten muss, das sehen wir uns später beim Überladen von Funktionen an.

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

Wird diese Header-Datei nun aber von einem C-Compiler eingelesen, so wird dieser eine Fehlermeldung ausgeben, da er die extern "C" Anweisung nicht kennt. Wir könnten nun jeweils eine Header-Dateien für den C Compiler und ein für C++ Compiler erstellen, was aber irgendwann zu Wartungsproblemen führen wird, da immer beide Header-Dateien gleichzeitig angepasst werden müssten. Im Beispiel unten ist eine der Lösungsmöglichkeiten für dieses Problems dargestellt. Der C++ Compiler definiert ein internes Symbol mit dem Namen __cplusplus (2 Underscore am Anfang!). Und dieses Symbol kann dann wie unten dargestellt mittels #ifdef...#endif abgefragt werden, um so bedingt die extern "C" Anweisung einzubinden. Die Anweisungen #ifdef...#endif werden gleich noch bei den Präprozessor-Anweisungen ausführlich behandelt.

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