Heim  >  Artikel  >  Backend-Entwicklung  >  Namensverwirrung und externes „C“ in C++

Namensverwirrung und externes „C“ in C++

WBOY
WBOYnach vorne
2023-08-29 10:21:111300Durchsuche

名称混淆和extern "C"在C++中

In C++ können wir die Funktion zum Überladen von Funktionen verwenden. Mit dieser Funktion können wir Funktionen mit demselben Namen erstellen. Der einzige Unterschied besteht in der Art der Parameter und der Anzahl der Parameter. Der Rückgabetyp wird hier nicht berücksichtigt. Die Frage ist nun, wie unterscheidet C++ zwischen überladenen Funktionen im Zielcode?

Im Zielcode ändert es den Namen, indem es Informationen zu den Parametern hinzufügt. Die hier angewandte Technik wird „Namensmangel“ genannt. C++ verfügt über keine standardisierten Techniken zur Namensverzerrung. Daher verwenden verschiedene Compiler unterschiedliche Techniken.

Unten finden Sie ein Beispiel für die Namensverfälschung. Die überladene Funktion heißt func() und es gibt eine weitere Funktion my_function().

Beispiel

int func(int x) {
   return x*x;
}
double func(double x) {
   return x*x;
}
void my_function(void) {
   int x = func(2); //integer
   double y = func(2.58); //double
}

Einige C++-Compiler ändern es wie folgt:

Beispiel

int __func_i(int x) {
   return x*x;
}
double __func_d(double x) {
   return x*x;
}
void __my_function_v(void) {
   int x = __func_i(2); //integer
   double y = __func_d(2.58); //double
}

C unterstützt keine Funktionsüberladung. Wenn wir also C-Code in C++ verknüpfen, müssen wir sicherstellen, dass der Name des Symbols dies nicht tut ändern . Der folgende C++-Code erzeugt einen Fehler.

Beispiel

int printf(const char *format,...);
main() {
   printf("Hello World");
}

Ausgabe

undefined reference to `printf(char const*, ...)'
ld returned 1 exit status

Das Problem tritt auf, weil der Compiler den Namen von printf() geändert hat. Und die aktualisierte Definition der Funktion printf() wird nicht gefunden. Um dieses Problem zu lösen, müssen wir externes „C“ in C++ verwenden. Der C++-Compiler stellt sicher, dass Funktionsnamen nicht entstellt werden, wenn Code in diesem Block verwendet wird. Der Name wird sich also nicht ändern. Der obige Code sieht also so aus, um dieses Problem zu lösen.

Beispiel

extern "C" {
   int printf(const char *format,...);
}
main() {
   printf("Hello World");
}

Ausgabe

Hello World

Hinweis: Diese Codeblöcke können in verschiedenen Compilern unterschiedliche Ergebnisse erzeugen.

Das obige ist der detaillierte Inhalt vonNamensverwirrung und externes „C“ in C++. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen