Les spécificateurs de classe de mémoire

Il existe 5 mots-clés du langage que la grammaire nomme spécificateur de classe de mémoire. Il s'agit des mots-clés suivants :
auto
Ce spécificateur de classe mémoire n'est autorisé que pour les variables locales à une instruction composée. Il indique que la variable concernée a une durée de vie locale à l'instruction composée. Si la déclaration d'une variable locale ne comporte pas de spécificateurs de classe de mémoire, c'est auto qui est pris par défaut (en pratique, on n'utilise donc jamais auto vu qu'il est implicite9.1).

Exemple :

{
  auto int i;
  ...
}

static
Ce spécificateur de classe mémoire est autorisé pour les déclarations de variables et de fonctions. Pour les déclarations de variables, il indique que la variable concernée a une durée de vie globale. Dans tous les cas, (variables et fonctions), il indique que le nom concerné ne doit pas être exporté par l'éditeur de liens. Exemple :

static int i; /* i ne sera pas exporté par
                 l'éditeur de liens   */
int j;        /* j sera exporté par l'éditeur de liens */

static void f() /* f ne sera pas exporté par
                   l'éditeur de liens */
{
  static int k; /* k aura une durée de vie globale */
  ...
}

void g()        /* g sera exportée par l'éditeur de liens */
{
  ...
}

register
Ce spécificateur n'est autorisé que pour les déclarations de variables locales à une instruction composée, et pour les déclarations de paramètres de fonctions. Sa signification est celle de auto avec en plus une indication pour le compilateur d'allouer pour la variable une ressource à accès rapide. Le programmeur est supposé mettre une variable dans la classe register quand elle est fortement utilisée par l'algorithme. Il y a cependant une contrainte : une telle variable n'a pas d'adresse, impossible donc de lui appliquer l'opérateur &.

extern
Ce spécificateur est autorisé pour les déclarations de variables et de fonctions. Il sert a indiquer que l'objet concerné a une durée de vie globale et que son nom est connu de l'éditeur de liens.

typedef
Ce spécificateur n'a rien à voir avec les classes de mémoire : il sert à définir des types. Son utilité sera vue plus loin.



Sous-sections
Matthieu Moy 2017-02-08