Verwendung von extern C in C++

Mehvish Ashiq 12 Oktober 2023
Verwendung von extern C in C++

Dieses Tutorial behandelt die Namensverfälschung in C++, die Voraussetzung für das Verständnis der Auswirkungen von extern "C" in C++. Außerdem wird über extern "C" in der C++-Programmierung aufgeklärt.

Verwendung von extern "C" in C++

Wir verwenden das Schlüsselwort extern, um globale Variablen zu definieren, die auch als externe Variablen bekannt sind und außerhalb der Methode (Funktion) definiert werden. Wir können diese Variablen in einem Programm verwenden und den Wert mithilfe von Funktionen ändern.

Wenn das Schlüsselwort extern in der C++-Datei verwendet wird, hat ein bestimmter Funktionsname in C++ eine C-Verknüpfung. In dieser Situation wird der Compiler den Funktionsnamen nicht verstümmeln.

Was ist der Namensmangel in der C++-Programmierung?

Es ist eine Voraussetzung, um das Schlüsselwort extern in C++ zu verstehen. Also, lasst uns zuerst den Namen Mangeln lernen.

Die C++-Programmierung unterstützt die Funktion Funktionsüberladung. Wir können mehrere Funktionen mit demselben Namen haben, aber mit einer unterschiedlichen Anzahl von Argumenten und ihrem Datentyp.

Dabei wird der Datentyp return nicht berücksichtigt. Die Sorge ist, wie die überladenen Funktionen im Objektcode unterschieden werden.

Die Funktionsnamen werden im Objektcode geändert, indem Details zu den jeweiligen Argumenten hinzugefügt werden. Die hier verwendete Technik zum Hinzufügen von Argumentinformationen ist Name Mangling.

Denken Sie daran, dass es in der C++-Programmierung kein standardisiertes Verfahren zum Verfälschen von Namen gibt. Aus diesem Grund verwenden verschiedene Compiler verschiedene Techniken.

Das Folgende ist die praktische Demonstration von Name Mangling in der C++-Programmierung. Der folgende Code hat drei überladene Funktionen namens calculate und eine main-Methode.

Beispielcode:

int calculate(int number) { return number * number; }
double calculate(double number) { return number * number; }
float calculate(float number) { return number * number; }
int main(void) {
  int number1 = calculate(3);
  double number2 = calculate(3.38);
  float number3 = calculate(3.00);
}

Der C++-Compiler ändert den obigen Code, um zwischen überladenen Funktionen zu unterscheiden.

Beispielcode:

int __calculate_i(int number) { return number * number; }
double __calculate_d(double number) { return number * number; }
float __calculate_f(float number) { return number * number; }

int __main_v(void) {
  int number1 = __calculate_i(3);
  double number2 = __calculate_d(3.38);
  float number3 = __calculate_f(3.00);
}

Die C-Programmierung unterstützt das Überladen von Funktionen nicht. Daher müssen wir sicherstellen, dass die Funktionsnamen nicht geändert werden, wenn wir den C-Code mit einer C++-Datei verknüpfen.

Das folgende Code-Snippet generiert einen Fehler, weil der Compiler den Namen der printf()-Funktion ändert und die Definition der geänderten/aktualisierten printf()-Funktion nicht finden kann.

Beispielcode:

int printf(const char *format, ...);
int main() { printf("I'm learning the use of Extern in C++"); }

Wir verwenden das Schlüsselwort extern in der C++-Programmierung, um dieses Problem zu beseitigen. Immer wenn der C++-Compiler den Code innerhalb des extern "C" {}-Blocks findet, stellt er sicher, dass der Name der Funktion unverfälscht bleibt.

Das bedeutet, dass der Name der Funktion nicht geändert wird, wodurch das Programm erfolgreich ausgeführt werden kann. Denken Sie daran, dass verschiedene Compiler möglicherweise unterschiedliche Ausgaben für diese Codeblöcke generieren.

Beispielcode:

extern "C" {
int printf(const char *format, ...);
}
int main() { printf("I'm learning the use of Extern in C++"); }

Ausgang:

I'm learning the use of Extern in C++

Das extern "C" ist also eine Linkage-Spezifikation, die im Geltungsbereich des namespace liegen muss. Das extern "C" würde die Klassenmitglieder ignorieren.

Wir müssen dieses Schlüsselwort immer dann verwenden, wenn wir den C-Code in einer C++-Datei verlinken wollen.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook