Meilleure réponse
Ne confondez pas un type (comme int
) avec dautres aspects des déclarations (par exemple, une classe de stockage comme static
).
Ie, dans:
int x;
static int y;
x
et y
ont le même type, int
(le terme « type de données » est moins couramment utilisé en C et C ++; ce nest pas faux cependant).
Le mot-clé static
a trois significations différentes en C. Dans lexemple ci-dessus, il indique cette variable y
est « privée » pour cette unité de traduction particulière (car lunité de traduction peut être considérée comme un fichier source après toutes les directives #include
ont été traitées). Ainsi, une variable y
déclarée dans une autre unité de traduction est distincte de celle-ci.
Voici un exemple de la deuxième signification de static
en C:
void f() {
static int n = 2;
...
}
Cette statique signifie que la variable n
est partagé entre toutes les invocations de f()
et il persiste même après le retour de f()
(vous pouvez, par exemple, renvoyez un pointeur dessus). Linitialisation de n
vers 2
uniquement a lieu avant le démarrage du programme en C (sur le premier invocation de f()
en C ++). Ainsi, la deuxième fois (et plus tard) f()
est appelée, n
conservera la valeur quelle avait auparavant (jusquà ce que le programme le modifie à nouveau ).
La troisième signification est moins courante (et, je pense, moins connue):
void g(double x[static 5]) {
...
}
Cela indique que g()
ne peut être appelé quavec un pointeur vers la première dau moins 5 valeurs double
dans la formation du tableau.
EDIT: Correction de lexplication de local initialisation statique comme (voir le commentaire de Jesse Pollard).
Réponse
La statique est lopposé de la dynamique. Hein? Cela signifie que la mémoire allouée pour cette variable ne bouge pas en mémoire. Cela signifie également que dans les appels répétés à des fonctions qui accèdent à cette variable, de nouveaux clichés instantanés de la variable ne sont pas créés; la variable dorigine est utilisée, et toute autre fonction accédant à cette variable à cette adresse peut la modifier ou la lire. Ce nest pas en soi une variable globale; sa portée reste la même que lendroit et la manière dont elle a été définie. Cela pourrait être, cependant. Ce serait cependant une erreur dessayer de définir une autre variable statique du même nom dans le même fichier ou incluse dans une application.
considérons une simple fonction dajout en C:
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
le nombre et le dernier sont définis statiques. Cela signifie que les valeurs qui y sont placées persistent sur plusieurs appels à ajouter. count et last sont initialisés à zéro, mais ne sont pas remis à zéro à chaque appel. Notez que la portée de count et last sont uniquement dans la fonction add. Ils ne peuvent pas être partagés avec dautres fonctions ou être accessibles en dehors de add, donc pour y accéder, vous devez les imprimer depuis lintérieur de la fonction. Dautres fonctions pourraient également avoir un nombre identique et des dernières variables statiques et elles ninteragiraient jamais.
Maintenant, regardez ce programme de test:
#include
static int count = 5;
static int last = 0;
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
int main(int argc, char**argv )
{
static int count = 10;
static int last = 0;
int i;
int a=1, b=1;
for(i = 0 ; i < count ; i++)
{
a = add(a, b);
b = add(a, last);
last = add(a, b);
}
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last);
return 0;
}
Trois sont 3 ensembles de variables statiques qui comptent et le dernier; tous sont séparés. Premièrement, les globaux, ils ne sont jamais utilisés ici. main
a son propre ensemble quil utilise car ses variables locales occultent les globaux. add
a son propre ensemble qui masque à la fois les principaux et les globaux du même nom.
Définitions de fonctions statiques sont un autre genre de chose. Le mot statique indique que la fonction est visible uniquement dans le fichier qui est compilé à partir de la source où la fonction est définie. Il s’agit du fichier source (“.c”) ou d’un en-tête (“.h) fichier inclus dans celui-ci. Cela peut être nécessaire si les fichiers objets que vous utilisez ont plus dune version dune fonction avec le même nom, (comme ajouter, imprimer, erreur,…) afin que la combinaison de fichiers objets (". O") ensemble en tant que modules ne provoque pas de conflits de noms.