Classe de stockage

Écrit le 11/11/2004 par Wikibooks
Dernière mise à jour : 02/02/2006

Le langage C permet de spécifier, avant le type d'une variable, un certain nombre de classe de stockage :

Classe 'const'

La classe const ne définit pas une vraie constante, mais indique plutôt au compilateur que la valeur de la variable ne devrait jamais changer. Il est donc impératif d'assigner une valeur à la déclaration de la variable, sans quoi toute tentative de modification ultérieure pourra générer un avertissement du compilateur :

const int i = 0;

i = 1;             /* avertissement */

En fait, le mot-clé const est beaucoup plus utilisé avec des pointeurs. Pour indiquer qu'on ne modifie pas l'objet pointé, il est bon de spécificier le mot-clé const :

void fonction( const char * pointeur )
{
    pointeur[0] = 0;     /* avertissement */
    pointeur    = "Nouvelle chaine de caractère";
}

Dans cet exemple, on indique que l'objet pointé ne sera pas modifié. Pour indiquer que la valeur elle-même du pointeur est constante, il faut déclarer la variable de la sorte :

char * const pointeur = "Salut tout le monde !";

pointeur = "Hello world !";  /* avertissement */

Encore plus subtil, on peut mélanger les deux :

const char * const pointeur = "Salut tout le monde !";

pointeur = "Hello world !";  /* avertissement */
pointeur[0] = 0;             /* avertissement */

Cette dernière forme est néanmoins rarement usitée.

Classe 'volatile'

Ce mot-clé est l'antonyme de register. Il est peu utilisé.

Il sert à spécifier au compilateur que la variable peut être modifiée à son insu. Elle n'est pas enregistrée dans un registre, le processeur va donc la chercher en mémoire à chaque utilisation ce qui baisse les performances. Ceci sert par exemple pour les coordonnées d'un pointeur de souris qui seraient modifiées par un autre programme, ou par exemple pour de la programmation avec de multiples fils d'exécution qui doivent communiquer entre eux.

Remarque : Dans le cas d'architectures avec cache non-cohérent le mot-clé volatile oblige le compilateur à lire la variable dans le cache mais pas dans la mémoire.

Classe 'auto'

Cette classe ne sert qu'à maintenir une certaine compatibilité avec le prédécesseur du C : le langage B. Car en fait, ce dernier ne comportait aucune notion de type, mais uniquement de classe. Comme il fallait bien mettre un mot clé avant la définition d'une variable, celui-ci servait de passe-partout. En C, ce mot clé est tombé en désuétude.

Classe 'register'

Indique que la variable devrait être stockée dans un registre du processeur. Les registres du processeur sont forcément limités, aussi bien en nombre qu'en taille. Inutile de déclarer une structure entière ou un tableau avec le mot clé register.

Qui plus est, les variables registres sont forcément locales à des fonctions. On ne peut pas déclarer une variable globale en tant que registre.

Ce mot-clé est déconseillé sauf pour des cas particuliers, les compilateurs modernes sachant généralement mieux que le programmeur comment optimiser et quelles variables placer dans les registres.

Classe 'static'

L'effet de la classe 'static' dépend de l'endroit où l'objet est déclaré :
* Objet local à une fonction : la valeur de la variable sera persistante entre les différents appels de la fonction. C'est une sorte de variable globale privée. L'intérêt de déclarer la variable à l'intérieur de la fonction est de garantir une certaine encapsulation, afin d'éviter des « optimisations » (usages multiples) d'une variable globale. Qui plus est, cela permet d'avoir plusieurs fois le même nom, dans des fonctions différentes.
* Objet global : comme une variable globale est déjà persistante, le mot-clé static aura pour effet de limiter la visibilité de la variable au seul module où elle est déclarée (cela s'applique aussi et surtout aux fonctions), toujours dans le but de garantir un certain niveau d'encapsulation.

Les paramètres des fonctions ne peuvent être déclarés 'static'.

Classe 'extern'

extern permet de récupérer une variable définie dans un autre fichier. Toutes variables globales, autres que celles déclarées static, sont accessibles avec ce mot-clé.

À noter que, héritage de l'ANSI C89 qui ne disposait pas encore du prototypage, toutes les fonctions autres que static sont directement accessibles dans tous les modules. Il est néanmoins plus que conseillé de s'assurer que chaque fonction utilisée ait son prototype déclaré. Dans le cas du prototypage, le mot clé extern est implicite : pas la peine de le rajouter.

Cet article provient de Wikibooks et est sous licence GNU Free Documentation License. Il a été écrit par plusieurs personnes et est constamment mis à jour. Cet article est la version du 2 mai 2005 à 11:47. L'article d'origine se trouve à http://fr.wikibooks.org/wiki/Programmation_C_Classe de_stockage.