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

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

WBOY
Libérer: 2023-08-29 10:21:11
avant
1333 Les gens l'ont consulté

名称混淆和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
}
Copier après la connexion

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
}
Copier après la connexion

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");
}
Copier après la connexion

Output

undefined reference to `printf(char const*, ...)'
ld returned 1 exit status
Copier après la connexion

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");
}
Copier après la connexion

Sortie

Hello World
Copier après la connexion

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!

source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal