est-il possible de déclarer plusieurs variables statiques du même nom dans un seul fichier C avec des cordes différentes? J'ai écrit un programme simple pour vérifier cela et dans GCC, il a été compilé et a fonctionné bien.
code: p> MAINTERIE est que toute la variable "statique" réside Dans la même section (.Data), alors comment nous pouvons avoir plusieurs variables avec le même nom dans une section? p> i utilisé pourquoi le compilateur change le nom des variables (puisque c ne pas 'T Nom du nom de support Mangling)? P> P> objdump code> pour vérifier la section différente et constaté que toutes les variables statiques (
svar code>) était en section .Data mais avec des noms différents: p>
6 Réponses :
A
Comme il peut y avoir autant de statiques locales de fonction avec le même nom que vous le souhaitez (à condition qu'ils soient tous dans des domaines différents), le compilateur peut avoir à modifier leurs noms en interne (incorporer le nom de la fonction ou le numéro de ligne ou quoi que ce soit. que la lieur peut les distinguer. p>
C'est vrai, mais la variable statique locale et globale réside dans la même section de données et que vous ne pouvez pas avoir plusieurs variables de même nom dans les mêmes sections de données, c'est pourquoi le compilateur change le nom. S'il vous plait corrigez moi si je me trompe. Merci
@MoHammed: La façon dont je vous comprends, vous venez de répéter ma deuxième phrase. Pourquoi devrais-je être en désaccord avec ça? :) code>
Ya vrai .. :) Est-ce que cela signifie que c compiler également le nom du nom du nom de Mangling ??
Il peut manquer les noms ici (dans des noms C valides non valides), car il peut s'attendre à ce qu'aucun autre fichier d'objet ne s'en souque. Le lieur a besoin d'eux uniquement de manière à résoudre les accès de la mémoire relative lorsque la section de données est donnée une adresse fixe à l'heure de chargement.
Votre premier niveau de fonction Les variables statiques ne sont pas accessibles en dehors de la fonction - elles conservent simplement leurs valeurs lors d'appels ultérieurs. Je suppose que vous avez déjà noté cela lorsque vous avez exécuté votre code. P> svar code> est global à fichier, la seconde est locale à la fonction
myPrint () code> et troisième est local sur
principal () code > p>
Scoping Block. Lire K & R. P>
Le mot clé statique a différentes significations lorsqu'il est global et local, le premier svar code> est juste une variable globale indisponible à d'autres unités de traduction. Et variables statiques
svar code> dans
myprint () code> et
principal () code> sont dans des différentes étendues, elles sont donc différentes variables. Dans le corps de
myprint () code>
svar code> fait référence à la section locale statique (masquage global
svar code>), dans
myprint2 () code > Il fait référence au global (ce n'est pas masqué par rien de local), et dans
Main () Code> Il fait référence au SVAR local code> SVAR code>, qui masque à nouveau le global depuis le moment Il a été déclaré. P>
Il y a une différence entre visibilité em> et étendue em>; De plus, le mot clé code> statique code> a des significations différentes en fonction de la portée. p>
Ajout du mot-clé code> statique code> aux versions de la portée du bloc de Ajout du mot clé code> statique code> à la version de la portée du fichier de Svar code> (myprint :: Svar et Main: Svar) change leur étendue em> ( vie), mais pas leur visibilité; Les deux sont visibles uniquement dans leurs fonctions respectives et ne feront pas l'ombre ou masquer la version de la portée du fichier dans leur portée locale. Il indique que les variables ont une étendue statique, ce qui signifie que la mémoire d'entre eux est allouée au début du programme et tenu jusqu'à la fin du programme (par opposition à l'étendue automatique ou locale, où leur vie est limitée à la portée dans laquelle ils sont définis). p>
SVAR code> ne change pas de mesure (les variables de la portée du fichier ont une étendue statique par définition), mais cela change visibilité en ce qui concerne les autres unités de traduction; Le nom n'est pas exporté vers la liaison, il est donc possible d'accéder par nom d'une autre unité de traduction. Il est toujours visible dans l'unité de traduction actuelle, c'est pourquoi Myprint2 peut y accéder. p>
J'aime cette réponse et je soupçonne que c'est en fait ce que l'auteur est confondu.
Les deux fonctions créeront des piles différentes. Une partie statique sera donc différente . Il est donc possible que cela soit possible. p>
Aucun des statique local int svar; code> sera attribué sur la pile i> (s'il y a un tel concept), chaque corps de fonction est un bloc distinct, qui limite la Portée de la variable code> statique locale code>. Le compilateur utilise un schéma de renommage pour s'assurer que ces variables sont distinctes au moment de la liaison.
Ce ne sont que des noms intérieurs temporaires. Nom Mangling in C ++ s'applique à des choses comme des exportations de DLL. C'est une chose différente.
C Permet à Name Mangling et vous venez de l'avoir montré.
Le nom Mangling est un détail de mise en œuvre. C Ne "permet pas" comme tel, il l'utilise pour mettre en œuvre une fonctionnalité (apparemment - je ne savais pas que vous pouviez le faire, mais vous apprenez quelque chose de nouveau tous les jours). De même, C ++ n'est pas "autorisé" Nom Mangling, il l'utilise pour mettre en œuvre une surcharge de fonction.
Étant donné que les variables statiques de votre exemple sont différentes entités, le compilateur C doit proposer une solution pour traduire le nom à la variable correcte. Vous avez montré un exemple.