Sur le local et le global variables statiques en C++
C++ Primer dit
Chaque local statique de la variable est initialisée avant de la première fois
l'exécution passe par la définition de l'objet. Local de la statique sont
pas détruite quand une fonction se termine; ils sont détruits lorsque le programme
se termine.
Sont locales variables statiques toute différente de la global variables statiques? D'autres ensuite l'emplacement où elles sont déclarées, quoi d'autre est-il différent?
void foo () {
static int x = 0;
++x;
cout << x << endl;
}
int main (int argc, char const *argv[]) {
foo(); //1
foo(); //2
foo(); //3
return 0;
}
comparer avec
static int x = 0;
void foo () {
++x;
cout << x << endl;
}
int main (int argc, char const *argv[]) {
foo(); //1
foo(); //2
foo(); //3
return 0;
}
OriginalL'auteur JAM | 2012-08-29
Vous devez vous connecter pour publier un commentaire.
Les différences sont:
La deuxième différence peut être utile pour éviter les statique intialisation ordre fiasco, où les variables globales peuvent être consulté avant qu'ils ne soient initialisés. En remplaçant la variable globale avec une fonction qui renvoie une référence à une variable statique locale, vous pouvez garantir que c'est initialisée avant toute chose y accède. (Toutefois, il n'y a toujours pas de garantie qu'il ne sera pas détruit avant que les finitions accès; vous avez encore besoin de prendre le plus grand soin si vous pensez que vous avez besoin d'un accessible dans le monde de la variable. Voir les commentaires de l'un lien aider dans cette situation.)
OriginalL'auteur Mike Seymour
De leur champ d'application est différent. Mondial dont l'étendue est variable statique est accessible à n'importe quelle fonction dans le fichier, tandis que la fonction d'étendue variable n'est accessible qu'à l'intérieur de cette fonction.
pas défini à travers la compilation de l'unité de s. Au sein d'une unité de compilation de la commande est définie comme l'ordre de déclaration.
Vous avez raison... j'ai été trop vague dans le commentaire 🙂
OriginalL'auteur Ricket
Espérons-le, cet exemple permet de comprendre la différence entre les variables local et global.
de sortie:
OriginalL'auteur emon
Il vrai nom est:
Variables globales sont aussi statique de la durée de stockage de l'objet. La différence majeure à partir de variables globales sont:
Remarque: Une exception lors de la construction signifie qu'ils n'ont pas été initialisée et ne sont donc pas utilisés.
Donc, il va re-essayer la prochaine fois que la fonction est entré.
(c'est à dire qu'ils ne peuvent pas être vus à l'extérieur de la fonction)
En dehors de ce qu'ils sont comme les autres 'statique de la durée de stockage des objets.
Remarque: Comme tous les 'statique de la durée de stockage des objets s'ils sont détruits dans l'ordre inverse de leur création.
3.7.1 Statique de la durée de stockage (Note: 6.7 décrit l'initialisation de locaux variables statiques). 6.7 Déclaration (Constante d'initialisation (3.6.2) d'un bloc-champ d'application entité statique de la durée de stockage, le cas échéant, est effectuée avant son bloc est d'abord entré. ... Sinon, une telle variable est initialisée la première fois, le contrôle passe à travers ses declarationConstant d'initialisation (3.6.2) d'un bloc-champ d'application entité statique de la durée de stockage; une telle variable est considéré comme initialisé à la fin de son initialisation.)
OriginalL'auteur Martin York
La principale ou la plus sérieuse différence est le temps de l'initialisation. Statique locale variables sont initialisées sur le premier appel à la fonction où elles sont déclarées. Les globales sont initialisées à un certain point dans le temps avant l'appel à la fonction principale, si vous avez quelques globale des variables statiques, ils sont initialisée dans un ordre non spécifié, qui peut causer des problèmes; cela s'appelle l'initialisation statique fiasco.
OriginalL'auteur piokuc
Dans votre premier bloc de code, x est local à la foo() fonction qui signifie qu'il est créé dans foo() est détruit à la fin de la fonction après avoir cout. Cependant, dans votre deuxième bloc x est global, ce qui signifie que le champ d'application de x est l'ensemble du programme. Si vous voulais en vertu de l'int main votre pourrait cout << x << endl et il affiche toutefois, dans le premier bloc, il serait de dire que x n'est pas déclaré
OriginalL'auteur georges
les variables ne sont connus que dans un périmètre limité.
OriginalL'auteur eric njora murigi