En C++, nous pouvons utiliser la fonctionnalité de surcharge de fonctions. Grâce à cette fonctionnalité, nous pouvons créer des fonctions du même nom. La seule différence réside dans le type de paramètres et le nombre de paramètres. Le type de retour n'est pas pris en compte ici. La question est maintenant de savoir comment le C++ fait-il la différence entre les fonctions surchargées dans le code cible ?
Dans le code cible, il modifie le nom en ajoutant des informations sur les paramètres. La technique appliquée ici est appelée nom mutilation. C++ n’a pas de techniques standardisées de modification des noms. Par conséquent, différents compilateurs utilisent des techniques différentes.
Vous trouverez ci-dessous un exemple de modification de nom. La fonction surchargée s'appelle func() et il existe une autre fonction 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 }
Certains compilateurs C++ le modifieront comme ci-dessous -
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 ne prend pas en charge la surcharge de fonctions, donc lorsque nous lions du code C en C++, nous devons nous assurer que le nom du symbole ne le fait pas changement . Le code C++ suivant générera une erreur.
int printf(const char *format,...); main() { printf("Hello World"); }
undefined reference to `printf(char const*, ...)' ld returned 1 exit status
Le problème se produit parce que le compilateur a changé le nom de printf(). Et il ne trouve pas la définition mise à jour de la fonction printf(). Pour résoudre ce problème, nous devons utiliser extern "C" en C++. Lorsqu'un code est utilisé dans ce bloc, le compilateur C++ garantit que le nom de la fonction n'est pas mutilé. Le nom ne changera donc pas. Le code ci-dessus ressemblera donc à ceci pour résoudre ce problème.
extern "C" { int printf(const char *format,...); } main() { printf("Hello World"); }
Hello World
Remarque : Ces blocs de code peuvent produire des résultats différents selon les compilateurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!