Maison  >  Article  >  développement back-end  >  Confusion de noms et "C" externe en C++

Confusion de noms et "C" externe en C++

WBOY
WBOYavant
2023-08-29 10:21:111300parcourir

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

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().

Exemple

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 -

Exemple

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.

Exemple

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

Output

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.

Exemple

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

Sortie

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer