C - Classes de stockage

Une classe de stockage définit la portée (visibilité) et la durée de vie des variables et / ou des fonctions au sein d'un programme C. Ils précèdent le type qu'ils modifient. Nous avons quatre classes de stockage différentes dans un programme C -

  • auto
  • register
  • static
  • extern

La classe de stockage automatique

le auto la classe de stockage est la classe de stockage par défaut pour toutes les variables locales.

{
   int mount;
   auto int month;
}

L'exemple ci-dessus définit deux variables dans la même classe de stockage. «auto» ne peut être utilisé que dans des fonctions, c'est-à-dire des variables locales.

La classe de stockage de registre

le registerLa classe de stockage est utilisée pour définir les variables locales qui doivent être stockées dans un registre au lieu de la RAM. Cela signifie que la variable a une taille maximale égale à la taille du registre (généralement un mot) et ne peut pas avoir l'opérateur unaire '&' appliqué (car elle n'a pas d'emplacement mémoire).

{
   register int  miles;
}

Le registre ne doit être utilisé que pour les variables qui nécessitent un accès rapide comme les compteurs. Il convient également de noter que la définition de «registre» ne signifie pas que la variable sera stockée dans un registre. Cela signifie qu'il PEUT être stocké dans un registre en fonction des restrictions matérielles et d'implémentation.

La classe de stockage statique

le staticstorage class indique au compilateur de conserver une variable locale pendant la durée de vie du programme au lieu de la créer et de la détruire chaque fois qu'elle entre et sort de la portée. Par conséquent, rendre les variables locales statiques leur permet de conserver leurs valeurs entre les appels de fonction.

Le modificateur statique peut également être appliqué aux variables globales. Lorsque cela est fait, la portée de cette variable est restreinte au fichier dans lequel elle est déclarée.

En programmation C, quand static est utilisé sur une variable globale, il provoque le partage d'une seule copie de ce membre par tous les objets de sa classe.

#include <stdio.h>
 
/* function declaration */
void func(void);
 
static int count = 5; /* global variable */
 
main() {

   while(count--) {
      func();
   }
	
   return 0;
}

/* function definition */
void func( void ) {

   static int i = 5; /* local static variable */
   i++;

   printf("i is %d and count is %d\n", i, count);
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

i is 6 and count is 4
i is 7 and count is 3
i is 8 and count is 2
i is 9 and count is 1
i is 10 and count is 0

La classe de stockage externe

le externLa classe de stockage est utilisée pour donner une référence à une variable globale visible par TOUS les fichiers programme. Lorsque vous utilisez 'extern', la variable ne peut pas être initialisée cependant, elle pointe le nom de la variable vers un emplacement de stockage qui a été précédemment défini.

Lorsque vous avez plusieurs fichiers et que vous définissez une variable globale ou une fonction, qui sera également utilisée dans d'autres fichiers, extern sera utilisé dans un autre fichier pour fournir la référence de la variable ou de la fonction définie. Juste pour comprendre, extern est utilisé pour déclarer une variable globale ou une fonction dans un autre fichier.

Le modificateur extern est le plus couramment utilisé lorsqu'il y a deux fichiers ou plus partageant les mêmes variables globales ou fonctions comme expliqué ci-dessous.

First File: main.c

#include <stdio.h>
 
int count ;
extern void write_extern();
 
main() {
   count = 5;
   write_extern();
}

Second File: support.c

#include <stdio.h>
 
extern int count;
 
void write_extern(void) {
   printf("count is %d\n", count);
}

Ici, extern est utilisé pour déclarer count dans le deuxième fichier, où comme il a sa définition dans le premier fichier, main.c. Maintenant, compilez ces deux fichiers comme suit -

$gcc main.c support.c

Il produira le programme exécutable a.out. Lorsque ce programme est exécuté, il produit le résultat suivant -

count is 5