8
votes

Une variable externe située dans une fonction?

Selon Wikipedia:

http://fr.wikipedia.org/wiki/external_variable

Une variable externe peut également être déclarée à l'intérieur d'une fonction.

Quel est le but d'une variable externe déclarée dans une fonction? Devrait-il être aussi statique?


5 Réponses :


3
votes

La déclaration externe passe à l'intérieur d'une fonction. Cela signifie simplement qu'aucune autre fonction ne peut voir la variable. xxx


dans un autre fichier source: xxx

Il est simplement un moyen de "isoler" une variable, de sorte que ça ne " t accidentellement utilisé dans des endroits où il n'est pas censé être utilisé.


7 commentaires

Je n'obtiens pas comment cela est différent d'une variable locale régulière ... Comment extern le rend différent?


@ 0x499602D2 extern Indique au compilateur 'Cette variable est définie ailleurs.' Cela ne définit rien, cela ne fait que déclarer.


@ 0x499602D2: Il ne définit pas une variable; Il déclare un qui existe ailleurs. Ce n'est donc pas "local" du tout.


C'est une variable gloobale définie dans un autre fichier source. Faire FOO ++; sur une variable locale non définie serait un comportement indéfini et une inutile. Les deux en font une mauvaise idée.


@ 0x499602D2: J'ai ajouté quelques autres extraits de code pour expliquer mieux (je pense ...)


Je voudrais donc initialiser ma variable à dire, la valeur 10 ailleurs, mais il ne serait peut-être pas utilisé dans Func ()?


@ user997112: Oui, et bien sûr n'importe où ailleurs, vous mettez une déclaration externe, ainsi que n'importe quel endroit qui a réellement foo dans le fichier source [lieux après sa définition, car les compilateurs ne peuvent pas "voir" en avant lors de la découverte de quelle variable est].



4
votes

Il permet de restreindre l'accès à une portée globale à une portée: xxx


0 commentaires

2
votes

La seule différence entre déclarer une variable externe à la portée de l'espace de noms: xxx pré>

et la déclarant à la fonction de fonction: p>

#include <string>
void foo() {
    using std::string;
    string str1;
}

string str2; // Error - `using` not performed at this scope


0 commentaires

0
votes

Le texte fait référence à une déclaration non définissant d'une fonction variable externe intérieure. Extern Les définitions les fonctions intérieures sont illégales.

Donc, une déclaration non définie d'une fonction variable externe à l'intérieur signifie simplement que vous souhaitez utiliser cette variable à l'intérieur de cette fonction. La variable elle-même doit être une variable globale définie ailleurs.

Fondamentalement, si vous n'avez pas besoin d'accéder à cette variable globale (définie ailleurs) dans l'ensemble de la traduction et en avez-vous besoin de la nécessité à l'intérieur de cette fonction, il est parfaitement bonne idée de le déclarer localement. De cette façon, vous ne polluez pas l'espace de noms global avec des identifiants sans autre fonction.


6 commentaires

S'il ne peut être utilisé nulle part ailleurs - pourrait-il être avancé qu'il pourrait aussi être une variable statique locale? Y a-t-il une différence?


@ user997112: Je ne sais pas ce que vous entendez par "il ne peut être utilisé nulle part ailleurs". En fait, la variable elle-même peut être utilisée absolument n'importe où. (C'est une variable globale, après tout.) C'est juste qu'il nécessitera également une déclaration séparée dans d'autres endroits.


Dans la réponse ci-dessus, il semble que la variable ne peut pas être utilisée en dehors de la fonction, elle est déclarée externe dans?


@ user997112: Il existe une confusion entre les notions d'identifiant "variable" et "identifiant faisant référence à une variable". La variable est définie ailleurs. C'est global. Tout le monde peut déclarer cette variable et y accéder ainsi. Toutes les personnes. Donc, c'est juste une question de savoir comment vous le déclarez. En la déclarant localement, vous avez accès à cette variable localement. Toute autre localité peut également le déclarer localement et avoir accès à la même variable localement.


@ user997112: C'est comme Internet. Il n'y a qu'un seul internet global. Tout le monde peut y accéder en s'inscrivant avec ISP. Mais quand une personne s'inscrit avec le fournisseur de services Internet, cela ne signifie pas que cette personne permet à chacun d'utiliser sa connexion. Seule la personne qui s'est inscrite peut utiliser la connexion. Pendant ce temps, d'autres personnes peuvent également s'inscrire avec leurs propres fournisseurs de services Internet et avoir accès au même Internet.


Et c'est la manière dont une variable globale fonctionne: il n'y a qu'une seule variable globale, disons, int A; défini dans un fichier quelque part. Tout le monde peut "établir une connexion" à cette variable globale en le déclarant comme extern int a; . Maintenant, cette connexion peut être établie localement, à l'intérieur d'une fonction, de sorte que seule cette fonction a accès à la connexion. Mais cela n'empêche aucune autre fonction d'établir sa propre connexion locale en faisant son propre extern int a; Déclaration. Toutes ces fonctions accéderont à la même variable globale A .



0
votes

Le mot clé extern dit qu'un identifiant a une liaison externe. Cela signifie qu'il est lié au même nom ailleurs, il est déclaré avec une liaison externe. C'est-à-dire que les différentes instances du nom dans différents endroits font référence au même objet.

Déclaration d'un identifiant à l'intérieur d'un bloc (y compris le bloc qui définit une fonction) donne une portée bloquée. La portée de cette instance de l'identifiant se termine à la fin du bloc.

combinaison externe avec la portée du bloc permet à une fonction de voir un identifiant externe sans encombrer l'espace d'autres fonctions. (Néanmoins, c'est souvent une mauvaise pratique.)


0 commentaires