Heim >Backend-Entwicklung >C++ >Namensverwirrung und externes „C' in 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().
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:
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.
int printf(const char *format,...); main() { printf("Hello World"); }
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.
extern "C" { int printf(const char *format,...); } main() { printf("Hello World"); }
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!