Pourquoi déclarer une variable ou une fonction statique en C?

Je comprends ce que fait statique, mais pas pourquoi nous l’utilisons. Est-ce juste pour garder la couche d’abstraction?

Il y a quelques raisons d’utiliser static dans C.

Lorsqu’il est utilisé avec des fonctions, oui, l’intention est de créer une abstraction. Le terme d’origine pour désigner la scope d’un fichier de code source C était “unité de traduction”. Les fonctions statiques ne peuvent être atteintes que depuis la même unité de traduction. Ces fonctions statiques sont similaires aux méthodes privées en C ++, interprétées de manière libérale (dans cette analogie, une unité de traduction définit une classe).

Les données statiques au niveau global ne sont également pas accessibles de l’extérieur de l’unité de traduction, ce qui est également utilisé pour créer une abstraction. En outre, toutes les données statiques sont initialisées à zéro, elles peuvent donc être utilisées pour contrôler l’initialisation.

La variable statique au niveau local (“automatique”) est utilisée pour résumer l’implémentation de la fonction qui maintient l’état entre les appels, mais évite l’utilisation d’une variable au niveau de l’unité de traduction. De nouveau, les variables sont initialisées à zéro en raison de la qualification statique.

Le mot clé static a plusieurs utilisations. En dehors d’une fonction, elle limite simplement la visibilité d’une fonction ou d’une variable à l’unité de compilation (fichier .c) dans laquelle la fonction ou la variable apparaît. De cette manière, la fonction ou la variable ne devient pas globale. C’est une bonne chose, cela favorise une sorte de principe du «besoin de savoir» (n’exposez pas des choses qui n’ont pas besoin d’être exposées). Les variables statiques de ce type sont initialisées à zéro, mais bien entendu, les variables globales sont également à zéro; le mot-clé static n’est donc pas responsable de l’initialisation à zéro.

Les variables peuvent également être déclarées statiques dans une fonction. Cette caractéristique signifie que la variable n’est pas automatique, c’est-à-dire allouée et libérée dans la stack à chaque appel de la fonction. Au lieu de cela, la variable est allouée dans la zone de données statique, elle est initialisée à zéro et persiste pendant toute la durée du programme. Si la fonction la modifie au cours d’une invocation, la nouvelle valeur modifiée sera disponible lors de la prochaine invocation. Cela semble être une bonne chose, mais il y a de bonnes raisons pour laquelle “auto” est la valeur par défaut, et les variables “statiques” dans les fonctions doivent être utilisées avec parcimonie. En bref, les variables automatiques utilisent plus efficacement la mémoire et sont essentielles si vous voulez que votre fonction soit thread-safe.

static est utilisé à la fois comme spécificateur de classe de stockage et spécificateur de liaison . En tant que spécificateur de liaison, il limite la scope d’une variable ou d’une fonction par ailleurs globale à une seule unité de compilation. Cela permet, par exemple, à une unité de compilation de disposer de variables et de fonctions portant les mêmes noms d’identifiant que les autres unités de compilation, mais sans provoquer de conflit, car ces identifiants sont “masqués” par l’éditeur de liens. Ceci est utile si vous créez une bibliothèque par exemple et avez besoin de fonctions d’assistance internes qui ne doivent pas créer de conflit avec le code utilisateur.

En tant que spécificateur de classe de stockage appliqué à une variable locale, sa sémantique est entièrement différente, mais votre question semble impliquer que vous faites référence à un lien statique.

Fonctions statiques en C

En C, les fonctions sont globales par défaut. Le mot clé «statique» avant un nom de fonction la rend statique. Par exemple, la fonction fun () est statique.

 static int fun(void) { printf("I am a static function "); } 

Contrairement aux fonctions globales en C, l’access aux fonctions statiques est limité au fichier dans lequel elles sont déclarées. Par conséquent, lorsque nous voulons restreindre l’access aux fonctions, nous les rendons statiques. Une autre raison de rendre des fonctions statiques peut être la réutilisation du même nom de fonction dans d’autres fichiers.

Par exemple, si nous stockons le programme suivant dans un fichier file1.c

 /* Inside file1.c */ static void fun1(void) { puts("fun1 called"); } 

Et stocker le programme suivant dans un autre fichier file2.c

 /* Iinside file2.c */ int main(void) { fun1(); getchar(); return 0; } 

Maintenant, si nous compilons le code ci-dessus avec la commande “ gcc file2.c file1.c ”, nous obtenons l’erreur “référence non définie à fun1'” . This is because fun1() is declared fun1'” . This is because fun1() is declared static` dans fichier1.c et ne peut pas être utilisé dans fichier2.c. Voir aussi l’ explication ici , d’où proviennent les codes.