questions sur la gestion de noms en C ++

J’essaie d’apprendre et de comprendre le nom malmené en C ++. Voici quelques questions:

(1) de devx

Lorsqu’une fonction globale est surchargée, le nom tronqué généré pour chaque version surchargée est unique. Le changement de nom est également appliqué aux variables. Ainsi, une variable locale et une variable globale portant le même nom d’utilisateur ont toujours des noms distincts mutilés.

Existe-t-il d’autres exemples utilisant la gestion par nom, outre les fonctions de surcharge et les variables globales et locales du même nom?

(2) du wiki

Le besoin survient lorsque le langage permet de nommer différentes entités avec le même identifiant tant qu’elles occupent un espace de nom différent (un espace de nom est généralement défini par une directive de module, de classe ou d’espace de nom explicite).

Je ne comprends pas très bien pourquoi la gestion nominative ne s’applique qu’aux cas où les identificateurs appartiennent à des espaces de noms différents, car les fonctions de surcharge peuvent se trouver dans le même espace de noms et les variables globales et locales de même nom peuvent également se trouver dans le même espace. Comment comprendre cela?

Les variables portant le même nom mais ayant des scopes différentes utilisent-elles également le nom mutilé?

(3) C a-t-il un nom mutilé? Si ce n’est pas le cas, comment peut-il gérer le cas où certaines variables globales et locales portent le même nom? C n’a pas de fonction de surcharge, non?

Merci et salutations!

C ne modifie pas les noms, bien qu’il prévienne un trait de soulignement pour les noms de fonction, de sorte que printf(3) est en fait _printf dans l’object libc.

En C ++, l’histoire est différente. L’histoire en est que, à l’origine, Stroustrup avait créé “C with classes” ou cfront , un compilateur qui traduirait le C ++ ancien en C. Ensuite, le rest des outils – le compilateur C et l’éditeur de liens serait utilisé pour produire du code object. Cela impliquait que les noms C ++ devaient être traduits en noms C d’une manière ou d’une autre. C’est exactement ce que fait le nom mangling . Il fournit un nom unique pour chaque membre de classe et une fonction et variable global / namespace, de sorte que les noms d’espaces de noms et de classes (pour la résolution) et les types d’arguments (pour la surcharge) sont en quelque sorte inclus dans les noms de l’éditeur de liens finaux.

C’est très facile à voir avec des outils comme nm(1) – comstackz votre source C ++ et consultez les symboles générés. Ce qui suit est sur OSX avec GCC:

 namespace zoom { void boom( const std::ssortingng& s ) { throw std::runtime_error( s ); } } ~$ nm a.out | grep boom 0000000100001873 T __ZN4zoom4boomERKSs 

En C et C ++, les variables locales (automatiques) ne produisent aucun symbole, mais vivent dans des registres ou sur une stack.

Modifier:

Les variables locales n’ont pas de noms dans le fichier object résultant pour la simple raison que l’éditeur de liens n’a pas besoin de les connaître. Donc pas de nom, pas de mutilation. Tout le rest (cet éditeur de liens doit regarder) est nominalement mutilé en C ++.

Mangling est simplement la façon dont le compilateur garde le lieur heureux.

En C, vous ne pouvez pas avoir deux fonctions portant le même nom, quoi qu’il en soit. C’est donc ce que le lieur a été écrit pour supposer: des noms uniques. (Vous pouvez avoir des fonctions statiques dans différentes unités de compilation, car leurs noms ne présentent aucun intérêt pour l’éditeur de liens.)

En C ++, vous pouvez avoir deux fonctions portant le même nom tant qu’elles ont des types de parameters différents. C ++ associe donc le nom de la fonction aux types d’une manière ou d’une autre. De cette façon, l’éditeur de liens les voit comme ayant des noms différents.

Notez que peu importe la façon dont le nom est mutilé, chaque compilateur le fait différemment. Tout ce qui compte est que chaque fonction portant le même nom de base soit en quelque sorte unique pour l’éditeur de liens.

Vous pouvez maintenant voir que l’ajout d’espaces de noms et de modèles au mélange continue à étendre le principe.

Techniquement, c’est “décorer”. Cela semble moins brutal, mais impliquerait en quelque sorte que CreditInterest pourrait être réorganisé dans IntCrederestit alors que ce qui se passe réellement ressemble plus à _CreditInterest@4 qui est, à vrai dire, “décoré” plus que mutilé. Cela dit, je l’appelle aussi malheureuse 🙂 mais vous trouverez plus d’informations techniques et d’exemples si vous recherchez “Décoration du nom C ++”.

Existe-t-il d’autres exemples utilisant la gestion par nom, en plus des fonctions de surcharge et des variables globales et locales du même nom?

C ++ modifie tous les symboles, toujours. C’est juste plus facile pour le compilateur. En règle générale, la modification modifie quelque chose à propos de la liste de parameters ou des types, car ce sont les causes les plus courantes de la nécessité de la modification.

C ne pas mutiler. La scope est utilisée pour contrôler l’access aux variables locales et globales du même nom.

Source: http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html

La gestion des noms est le processus utilisé par les compilateurs C ++ pour atsortingbuer un nom unique à chaque fonction de votre programme. En C ++, les programmes ont généralement au moins quelques fonctions portant le même nom. Ainsi, la gestion des noms peut être considérée comme un aspect important en C ++.

Exemple: Généralement, les noms de membres sont générés de manière unique en concaténant le nom du membre avec celui de la classe, par exemple à l’aide de la déclaration:

 class Class1 { public: int val; ... }; 

val devient quelque chose comme:

  // a possible member name mangling val__11Class1