À quoi sert le mot-clé "static" en C?

J’ai vu le mot clé « static » utilisé dans différents contextes dans le code C. S’agit-il d’une fonction/classe statique (dont l’implémentation est partagée entre plusieurs objets) ?

static signifie différentes choses dans différents contextes.

Vous pouvez déclarer une variable static dans une fonction C. Cette variable n’est visible que dans la fonction, mais elle se comporte comme une variable globale en ce sens qu’elle n’est initialisée qu’une seule fois et qu’elle maintient sa valeur. Dans cet exemple, chaque fois que vous appelez inc(), un nombre croissant sera affiché. La variable static n’est initialisée qu’une seule fois.

void inc()
{
   static int i = 0;
   printf("%d", i); i++
}

Une autre utilisation de static est lorsque vous implémentez une fonction ou une variable globale dans un fichier .c mais que vous ne voulez pas que son symbole soit visible en dehors du .obj généré par le fichier .c, par ex.

static void inc() { ... }

Si vous déclarez une variable dans une fonction static, sa valeur ne sera pas stockée sur la pile d’appel de la fonction et sera toujours disponible lorsque vous appellerez à nouveau la fonction.

Si vous déclarez une variable globale static, sa portée sera limitée au fichier dans lequel vous l’avez déclarée. C’est un peu plus sécurisé qu’une variable globale normale qui peut être lue et modifiée dans tout le programme.

Si vous déclarez une variable static dans un fichier appelé par exemple my_code.c :

static int my_variable;

Alors cette variable ne peut être vue qu’à partir de ce fichier. La variable ne peut être exportée nulle part ailleurs.

Si vous la déclarez à l’intérieur d’une fonction, la valeur de la variable gardera sa valeur chaque fois que la fonction sera appelée.

Une fonction static ne peut pas être exportée depuis l’extérieur du fichier. Ainsi, dans un fichier *.c, vous cachez les fonctions et les variables si vous les déclarez static.

En C, le terme static a deux significations, selon la portée de son utilisation. Dans la portée globale, lorsqu’un objet est déclaré au niveau du fichier, cela signifie que cet objet n’est visible que dans ce fichier.

Dans toute autre portée, il déclare un objet qui gardera sa valeur entre les différents moments où la portée particulière est saisie. Par exemple, si un entier est déclaré dans une fonction :

void my_function(void)
{
   static int i = 0;
   i++;
}

la valeur de ‹ i › est initialisée à zéro lors du premier appel de la fonction, et la valeur est mémorisée à chaque fois que la fonction est appelée. si ‹ i › est appelé, une séquence de 0, 1, 2, 3, … serait affichée.