Programmation en C – Les 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 dans 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
 

auto : La classe de stockage automatique

La classe de stockage automatique est la classe de stockage par défaut pour toutes les variables locales.

{
   int mois;   
   auto int mois;
}

L’exemple ci-dessus définit deux variables avec la même classe de stockage  ‘Auto’ ne peut être utilisé que dans les fonctions, c’est-à-dire des variables locales.
 

register : La classe de stockage registre

La classe de stockage registres est utilisée pour définir des 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é sur elle (car il n’a pas d’emplacement de mémoire).

{
   register int  miles;
}

Le registre ne doit être utilisé que pour les variables nécessitant 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 pourrait être stocké dans un registre en fonction du matériel et des restrictions d’implémentation.
 

static : La classe de stockage statique

La classe de stockage statique demande au compilateur de conserver une variable locale en existence 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 son champ d’application. Par conséquent, rendre les variables locales statiques leur permet de maintenir leurs valeurs entre les appels de fonction.

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

En programmation C, lorsqu’un statique est utilisé sur un membre de données d’une classe, il ne fait que partager une seule copie de ce membre avec tous les objets de sa classe.

#include <stdio.h> 

/* Déclaration de la fonction */
void func(void);
 
static int c = 5; /* Variable globale */
 
main() {
   while(c--) {
      func();
   }
   return 0;
}

/* Définition de la fonction */
void func( void ) {

   static int i = 5; /* Variable statique locale */
   i++;

   printf("i est %d et c est %dn", i, c);
}

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

i est 6 et c est 4
i est 7 et c est 3
i est 8 et c est 2
i est 9 et c est 1
i est 10 et c est 0

 
 

extern : La classe de stockage externe

La classe de stockage externe est utilisée pour donner une référence d’une variable globale qui est visible pour TOUS les fichiers de programme. Lorsque vous utilisez ‘extern’, la variable ne peut pas être initialisée cependant, il indique le nom de la variable à un emplacement de stockage qui a été défini précédemment.

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

Le modificateur externe est le plus couramment utilisé lorsqu’il existe deux ou plusieurs fichiers partageant les mêmes variables globales ou fonctions comme expliqué ci-dessous.

Fichier 1 :
#include <stdio.h>

int c ;
extern void ecrire_extern();
 
main() {
   c = 5;
   ecrire_extern();
}

 

Fichier 2 :
#include <stdio.h>

extern int c;

void ecrire_extern(void) {
    printf("c est %dn", c);
}

Compilez ces deux fichiers comme suit

$gcc main.c compter.c

Lorsque ce programme est exécuté, il produit le résultat suivant

c est 5

 
 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *