11
votes

Est-il possible de déclarer plusieurs variables statiques avec le même nom dans un seul fichier C?

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: xxx

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?

i utilisé objdump pour vérifier la section différente et constaté que toutes les variables statiques ( svar ) était en section .Data mais avec des noms différents: xxx

pourquoi le compilateur change le nom des variables (puisque c ne pas 'T Nom du nom de support Mangling)?


4 commentaires

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.


6 Réponses :


22
votes

A Variable statique de la fonction locale est quelque chose de différent d'une variable statique .
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.


4 commentaires

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? :)


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.



2
votes

Votre premier svar est global à fichier, la seconde est locale à la fonction myPrint () et troisième est local sur principal ()

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.


0 commentaires

1
votes

Scoping Block. Lire K & R.


0 commentaires

1
votes

Le mot clé statique a différentes significations lorsqu'il est global et local, le premier svar est juste une variable globale indisponible à d'autres unités de traduction. Et variables statiques svar dans myprint () et principal () sont dans des différentes étendues, elles sont donc différentes variables. Dans le corps de myprint () svar fait référence à la section locale statique (masquage global svar ), dans myprint2 () Il fait référence au global (ce n'est pas masqué par rien de local), et dans Main () Il fait référence au SVAR local SVAR , qui masque à nouveau le global depuis le moment Il a été déclaré.


0 commentaires

7
votes

Il y a une différence entre visibilité et étendue ; De plus, le mot clé statique a des significations différentes en fonction de la portée.

Ajout du mot-clé statique aux versions de la portée du bloc de Svar (myprint :: Svar et Main: Svar) change leur étendue ( 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).

Ajout du mot clé statique à la version de la portée du fichier de SVAR 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.


1 commentaires

J'aime cette réponse et je soupçonne que c'est en fait ce que l'auteur est confondu.



0
votes

Les deux fonctions créeront des piles différentes. Une partie statique sera donc différente . Il est donc possible que cela soit possible.


1 commentaires

Aucun des statique local int svar; sera attribué sur la pile (s'il y a un tel concept), chaque corps de fonction est un bloc distinct, qui limite la Portée de la variable statique locale . Le compilateur utilise un schéma de renommage pour s'assurer que ces variables sont distinctes au moment de la liaison.