« Programmation C/Classe de stockage » : différence entre les versions

Contenu supprimé Contenu ajouté
Balise : insanités
Ligne 17 :
=== Classe 'static' ===
L'effet de la classe 'static' dépend de l'endroit où l'objet est déclaré :
* ''Objet local à uneun fonctionbloc'' : la valeur de la variable sera persistante entre les différents appels de la fonction où se trouve le bloc. La variable ne sera visible que dans la fonction, mais ne sera pas réinitialisée à chaque appel de la fonction. L'intérêt est de garantir une certaine encapsulation, afin d'éviter des usages multiples d'une variable globale. Qui plus est, cela permet d'avoir plusieurs fois le même nom, dans des fonctions différentes.
 
Exemple :
Ligne 47 :
i vaut 3 et j vaut 1.
</source>
 
Il est déconseillé de redéfinir plusieurs fois la même variable statique dans différents blocs, car le résultat peut être surprenant :
 
<source lang="c">
#include <stdio.h>
 
void toto(void) {
static char toto = 'A';
printf("deb fun: %c\n", toto);
{
printf("deb block: %c\n", toto);
static char toto = 'M';
printf("fin block: %c\n", toto);
toto ++;
}
toto++;
printf("fin fun: %c\n", toto);
}
 
 
int main(void)
{
toto();
toto();
return 0;
}
</source>
 
Affiche
<source>
deb fun: A
deb bloc: A
fin bloc: M
fin fun: B
deb fun: B
deb bloc: B
fin bloc: N
fin fun: C
</source>
 
On voit que la durée de vie de la variable de bloc statique ne commence qu'à partir de sa déclaration, même si la déclaration n'est exécutée qu'une fois au cours du programme.
 
* ''Objet global et fonction'' : comme une variable globale est déjà persistante, le mot-clé <code>static</code> aura pour effet de limiter la portée de la variable ou de la fonction au seul fichier où elle est déclarée, toujours dans le but de garantir un certain niveau d'encapsulation.