Pourquoi et quand utiliser des structures statiques en programmation C?

J’ai souvent vu des déclarations de structure statiques dans un code de pilote qu’il m’a été demandé de modifier.

J’ai essayé de rechercher des informations sur les raisons pour lesquelles les structs sont déclarées statiques et sur la motivation de le faire.

Quelqu’un peut-il m’aider à comprendre cela?

Le mot clé static en C a plusieurs effets, en fonction du contexte auquel il est appliqué.

  • lorsqu’elle est appliquée à une variable déclarée à l’intérieur d’une fonction, la valeur de cette variable sera préservée entre les appels de fonction.
  • lorsqu’elle est appliquée à une variable déclarée en dehors d’une fonction, ou à une fonction, la visibilité de cette variable ou de cette fonction est limitée à “l’unité de traduction” dans laquelle elle est déclarée – c’est-à-dire le fichier lui-même. Pour les variables, cela revient à une sorte de “variable globale visible localement”.

Les deux utilisations sont assez communes dans le code de niveau relativement bas, comme les pilotes.

Le premier, et le dernier, lorsqu’il est appliqué à des variables, permettent aux fonctions de conserver une notion d’état entre les appels, ce qui peut s’avérer très utile, mais cela peut également causer toutes sortes de problèmes désagréables lorsque le code est utilisé dans n’importe quel contexte où il est utilisé. utilisé simultanément, soit par plusieurs threads, soit par plusieurs appelants. Si vous ne pouvez pas garantir que le code sera appelé de manière ssortingcte et séquentielle par un “utilisateur”, vous pouvez transmettre une sorte de structure de “contexte” maintenue par l’appelant à chaque appel.

Ce dernier, appliqué aux fonctions, permet au programmeur de rendre la fonction invisible de l’extérieur du module, et cela PEUT être un peu plus rapide avec certains compilateurs pour certaines architectures car le compilateur sait qu’il n’est pas obligé de rendre la variable / fonction disponible à l’extérieur. le module – permettant à la fonction d’être en ligne par exemple.

Apparemment, il manque quelque chose qui manque: static est une valeur et spécifie également une durée de stockage pour un object, ainsi que automatique (variables locales) et alloué (mémoire renvoyée par malloc et ses amis).

Les objects ayant une durée de stockage statique sont initialisés avant le démarrage de main (), avec l’initialiseur spécifié ou, si aucune donnée n’a été fournie, comme si 0 lui avait été atsortingbué (pour les structures et les tableaux, cela s’applique à chaque membre et de manière récursive).

La deuxième propriété, static pour un identifiant, est sa liaison , concept utilisé au moment de la liaison et indiquant au lieur quels identificateurs font référence au même object. Le mot clé static donne à un identificateur un lien interne , ce qui signifie qu’il ne peut pas faire référence à des identifiants du même nom dans une autre unité de traduction.

Et pour être au courant de toutes les réponses bâclées que j’ai lues auparavant: une variable statique ne peut pas être référencée partout dans le fichier où elle est déclarée. Sa scope va seulement de sa déclaration (qui peut être entre les définitions de fonctions) à la fin du fichier source – ou même plus petit, à la fin du bloc englobant.

Si vous déclarez une variable comme étant static , elle n’est visible que dans cette unité de traduction (si elle est déclarée globalement) ou conserve sa valeur d’un appel à l’autre (si elle est déclarée dans une fonction).

Dans votre cas, je suppose que c’est le premier cas. Dans ce cas, le programmeur ne voulait probablement pas que la structure soit visible à partir d’autres fichiers.

Le modificateur static de la struct limite le champ de visibilité de la structure à l’unité de traduction actuelle (c’est-à-dire le fichier).

REMARQUE: cette réponse suppose (comme d’autres intervenants l’ont indiqué) que votre déclaration ne fait pas partie d’une fonction.

variable variable

Pour une variable de structure telle que static struct S s; , cela a été largement discuté à: Que signifie “statique”?

définition de la structure: aucun effet :

 static struct S { int i; int j; }; 

est exactement la même chose que:

 struct S { int i; int j; }; 

alors ne l’utilisez jamais. GCC 4.8 déclenche un avertissement si si le faire.

Cela est dû au fait que les définitions de structure n’ont pas de stockage et ne génèrent pas de symboles dans les fichiers objects, tels que les variables et les fonctions. Essayez juste de comstackr et de décomstackr:

 struct S { int i; int j; }; int i; 

avec:

 gcc -c main.c nm main.o 

et vous verrez qu’il n’y a pas de symbole S , mais il y a un symbole i .

Le compilateur utilise simplement des définitions pour calculer le décalage des champs au moment de la compilation.

Ils doivent donc être inclus dans les fichiers d’en-tête.

La même chose vaut pour enum .

Définition de la structure C ++: obsolète en C ++ 11

Projet d’ Annexe C 7.1.1 standard C ++ 11 N3337 :

Modification: en C ++, les spécificateurs statiques ou externes ne peuvent être appliqués qu’aux noms d’objects ou de fonctions. L’utilisation de ces spécificateurs avec des déclarations de type est illégale en C ++. En C, ces spécificateurs sont ignorés lorsqu’ils sont utilisés dans des déclarations de type.

Voir aussi: https://stackoverflow.com/a/31201984/895245