En langage C, le sens littéral de static peut facilement nous induire en erreur ; en fait, il a trois rôles.
(1) Tout d'abord, présentons son premier et plus important rôle : le masquage.
Lorsque nous compilons plusieurs fichiers en même temps, toutes les variables globales et fonctions sans le préfixe static ont une visibilité globale. Pour comprendre cette affirmation, laissez-moi donner un exemple. Nous devons compiler deux fichiers source simultanément : l'un est a.c, et l'autre est main.c.
Voici le contenu de a.c :
Code du fichier a.c
void msg()
{
printf("Hello\n");
}
Voici le contenu de main.c :
Code du fichier main.c
{
extern char a; // la variable extern doit être déclarée avant utilisation
printf("%c ", a);
(void)msg();
return 0;
}
La sortie du programme est :
A Hello
Vous pourriez demander : pourquoi la variable globale a et la fonction msg définies dans a.c peuvent-elles être utilisées dans main.c ? Comme mentionné précédemment, toutes les variables globales et fonctions sans le préfixe static ont une visibilité globale, et les autres fichiers source peuvent également y accéder. Dans cet exemple, a est une variable globale et msg est une fonction, et aucun des deux n'a le préfixe static, ils sont donc visibles pour l'autre fichier source main.c.
Si static est ajouté, elles seront masquées aux autres fichiers source. Par exemple, si static est ajouté avant les définitions de a et msg, main.c ne les verra pas. En utilisant cette fonctionnalité, nous pouvons définir des fonctions et des variables portant le même nom dans différents fichiers sans nous soucier des conflits de nommage. static peut être utilisé comme préfixe pour les fonctions et les variables. Pour les fonctions, l'effet de static se limite au masquage, tandis que pour les variables, static a les deux rôles supplémentaires suivants.
(2) Le deuxième rôle de static est de maintenir la persistance du contenu des variables.
Les variables stockées dans la zone de données statique sont initialisées lors du premier démarrage du programme, et c'est la seule initialisation. Il existe deux types de variables stockées dans la zone de stockage statique : les variables globales et les variables statiques. Cependant, par rapport aux variables globales, static peut contrôler la portée visible des variables. En dernière analyse, static est toujours utilisé pour masquer. Bien que cet usage ne soit pas courant, je vais quand même donner un exemple.
Exemple
int fun(void){
static int count = 10; // En fait, cette instruction d'affectation n'a jamais été exécutée.
return count--;
}
int count = 1;
int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
La sortie du programme est :
global local static 1 10 2 9 3 8 4 7 5 6 6 5 7 4 8 3 9 2 10 1
(3) Le troisième rôle de static est d'initialiser par défaut à 0.
En fait, les variables globales possèdent aussi cette propriété, car les variables globales sont également stockées dans la zone de données statique. Dans la zone de données statique, la valeur par défaut de chaque octet en mémoire est 0,0x00et parfois cette caractéristique peut réduire la charge de travail du programmeur. Par exemple, lors de l'initialisation d'une matrice creuse, nous pouvons définir un par un tous les éléments à 0,0puis affecter les quelques éléments qui ne sont pas 0.0Si elle est définie comme static, l'opération initiale de mise à 0 est omise. Autre exemple, si nous voulons utiliser un tableau de caractères comme chaîne de caractères, mais que nous trouvons fastidieux d'ajouter00 à la fin du tableau de caractères chaque fois.\0Si la chaîne est définie comme static, ce souci disparaît, car elle est déjà à 0 à cet endroit.\0 。
Faisons une petite expérience pour vérifier.
Exemple
int a;
int main(void)
{
int i;
static char str[10];
printf("integer: %d; string: (begin)%s(end)", a, str);
return 0;
}
La sortie du programme est la suivante :
integer: 0; string: (begin)(end)
Enfin, résumons en une phrase les trois rôles de static. Premièrement, la fonction la plus importante de static est le masquage ; deuxièmement, parce que les variables static sont stockées dans la zone de stockage statique, elles ont une persistance et une valeur par défaut de 0.
Source : https://www.cnblogs.com/dc10101/archive/2007/08/22/865556.html