des questions sur le nom de déformation en C++
Je suis en train d'apprendre et de comprendre name mangling en C++. Voici quelques questions:
(1) à Partir de devx
Quand une fonction globale est surchargé, à la génération de déformation d'un nom pour chaque version surchargée est unique. Name mangling " est également appliqué aux variables. Ainsi, une variable locale et une variable globale avec le même utilisateur-nom donné encore obtenir distinctes noms déformés.
Existe-il d'autres exemples utilisant name mangling, en plus de la surcharge de fonctions et de même nom des variables globales et locales ?
(2) à Partir de Wiki
Le besoin s'en fait sentir, où le langage permet à des entités différentes d'être nommée avec le même identifiant, aussi longtemps qu'ils occupent un espace de noms différent (où un espace de noms est généralement définie par un module de classe, ou explicite de l'espace de noms de la directive).
Je n'arrive pas à comprendre pourquoi le nom de déformation est appliquée uniquement pour les cas où les identificateurs appartiennent à des espaces de noms différents, comme la surcharge des fonctions peuvent être dans le même espace de noms et le nom des variables globales et locales peuvent également être dans le même espace. Comment comprendre cela?
N'variables avec le même nom mais dans différentes étendues également utiliser le nom d'amputation?
(3) est-ce que C ont amputation des noms? Si cela ne fonctionne pas, comment peut-il traiter le cas lorsque certaines variables globales et locales ont le même nom? C n'a pas de surcharge de fonctions, droit?
Merci et salutations!
Vous devez vous connecter pour publier un commentaire.
C n'a pas de nom d'amputation, même si elle ne pré-pend un trait de soulignement pour les noms de fonction, de sorte que le
printf(3)
est en fait_printf
dans la libc objet.En C++, c'est différent. L'histoire, c'est que l'origine Stroustrup créé "C with classes" ou cfront, un compilateur qui traduit ce début de C++ à C. Puis reste des outils - C compilateur et l'éditeur de liens serions-nous utilisé pour produire le code de l'objet. Cela implique que le C++ les noms devaient être convertis en C noms en quelque sorte. C'est exactement ce que name mangling n'. Il fournit un nom unique pour chaque membre de la classe et global/espace de noms de fonction et de variable, de sorte que l'espace de noms et les noms de classe (de résolution) et les types d'argument (par surcharge) sont en quelque sorte inclus dans la version finale de l'éditeur de liens de noms.
C'est très facile à voir avec des outils comme
nm(1)
- compiler votre source C++ et regardez les symboles générés. La suite est sur OSX avec GCC:En C et C++ local (automatique) variables produisent pas de symboles, mais de vivre dans des registres ou sur pile.
Edit:
Les variables locales n'ont pas de noms de l'objet résultant de fichier pour la simple raison que l'éditeur de liens n'a pas besoin de les connaître. Donc pas de nom, pas de déformation. Tout le reste (que l'éditeur de liens a regarder) est le nom de déformation en C++.
Déformation est tout simplement la façon dont le compilateur maintient l'éditeur de liens heureux.
En C, vous ne pouvez pas avoir deux fonctions avec le même nom, n'importe quoi. C'est ce que l'éditeur de liens a été écrit à assumer: des noms uniques. (Vous pouvez avoir les fonctions statiques dans les différentes unités de compilation, car leurs noms ne sont pas d'intérêt pour l'éditeur de liens.)
En C++, vous pouvez avoir deux fonctions avec le même nom, aussi longtemps qu'ils ont différents types de paramètres. Donc, C++ combine le nom de la fonction avec les types d'une certaine façon. De cette façon, le linker les voit comme ayant des noms différents.
Noter qu'il n'a pas d'importance la façon dont le nom est mutilé, et en fait, chaque compilateur le fait différemment. Tout ce qui importe, c'est que toutes les fonctions avec le même nom de base est d'une certaine manière unique pour l'éditeur de liens.
Vous pouvez maintenant voir que l'ajout d'espaces de noms et des modèles pour le mélange conserve l'extension du principe.
Techniquement, c'est "décoration". Cela sonne moins brut mais également une déformation genre de implique que
CreditInterest
pourrait obtenir réarrangé dansIntCrederestit
alors que ce qui se passe réellement est plus comme_CreditInterest@4
qui est, disons-le, "orné" plus de déformation. Cela dit, je l'appelle une déformation trop 🙂 mais vous trouverez plus d'informations techniques et des exemples, si vous recherchez le "C++ décoration de nom".Existe-il d'autres exemples utilisant name mangling, en plus de la surcharge de fonctions et de même nom des variables globales et locales?
C++ mangles tous symboles, toujours. C'est plus facile pour le compilateur. Généralement, les mutilations code pour quelque chose à propos de la liste des paramètres ou des types comme ce sont les causes les plus courantes de la déformation d'être nécessaire.
C n'a pas de mutilation. La portée est utilisé pour contrôler l'accès à des variables locales et globales du même nom.
Source:http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html
Name mangling est le processus utilisé par les compilateurs C++ donner à chaque fonction dans votre programme un nom unique. En C++, en général, des programmes ont au moins quelques fonctions avec le même nom. Ainsi, le nom de déformation peut être considérée comme un aspect important dans le C++.
Exemple:
Généralement, les noms des membres sont uniquement générés par la concaténation du nom de la membre de la classe par exemple, compte tenu de la déclaration:
val devient quelque chose comme:
agner a plus d'informations sur ce qu'est un nom de déformation et de la façon dont c'est fait dans les différents compilateurs.