Quand utiliser le mot-clé statique avant les variables globales?

Quelqu’un peut-il expliquer quand vous êtes censé utiliser le mot-clé statique avant les variables globales ou les constantes définies dans les fichiers d’en-tête?

Par exemple, disons que j’ai un fichier d’en-tête avec la ligne:

const float kGameSpriteWidth = 12.0f; 

Est-ce que cela devrait être static devant const ou pas? Quelles sont les meilleures pratiques d’utilisation du static ?

static rend la variable locale au fichier, ce qui est généralement une bonne chose, voir par exemple cette entrée Wikipedia .

Vous ne devez pas définir de variables globales dans les fichiers d’en-tête. Vous devez les définir dans le fichier source .c.

  • Si la variable globale doit être visible dans un seul fichier .c, vous devez la déclarer statique.

  • Si la variable globale doit être utilisée sur plusieurs fichiers .c, vous ne devez pas la déclarer statique. Au lieu de cela, vous devez le déclarer extern dans le fichier d’en-tête inclus par tous les fichiers .c qui en ont besoin.

Exemple:

  • example.h

     extern int global_foo; 
  • foo.c

     #include "example.h" int global_foo = 0; static int local_foo = 0; int foo_function() { /* sees: global_foo and local_foo cannot see: local_bar */ return 0; } 
  • bar.c

     #include "example.h" static int local_bar = 0; static int local_foo = 0; int bar_function() { /* sees: global_foo, local_bar */ /* sees also local_foo, but it's not the same local_foo as in foo.c it's another variable which happen to have the same name. this function cannot access local_foo defined in foo.c */ return 0; } 

Oui, utilisez statique

Utilisez toujours des fichiers statiques dans les fichiers .c , sauf si vous devez référencer l’object depuis un autre module .c .

N’utilisez jamais de fichiers statiques dans les fichiers .h , car vous créerez un object différent chaque fois qu’il sera inclus.

Règle de base pour les fichiers d’en-tête:

  • déclarer la variable en tant que extern int foo; et mettre une initialisation correspondante dans un seul fichier source pour obtenir une valeur modifiable partagée entre les unités de traduction
  • utiliser static const int foo = 42; pour obtenir une constante pouvant être intégrée

static devant une variable globale signifie que cette variable n’est pas accessible depuis l’extérieur du module de compilation où elle est définie.

Imaginons par exemple que vous souhaitiez accéder à une variable dans un autre module:

 foo.c int var; // a global variable that can be accessed from another module // static int var; means that var is local to the module only. ... bar.c extern int var; // use the variable in foo.c ... 

Maintenant, si vous déclarez que statique est statique, vous ne pouvez y accéder que depuis le module où foo.c est compilé.

Notez qu’un module est le fichier source actuel, plus tous les fichiers inclus. c’est-à-dire que vous devez comstackr ces fichiers séparément, puis les lier ensemble.

Le mot-clé static est utilisé en C pour restreindre la visibilité d’une fonction ou d’une variable à son unité de traduction . L’unité de traduction est l’entrée ultime d’un compilateur C à partir duquel un fichier object est généré.

Vérifiez ceci: Lien | Unité de traduction

Le mécanisme correct pour C ++ dans les espaces de noms anonymes. Si vous voulez quelque chose qui est local à votre fichier, vous devez utiliser un espace de noms anonyme plutôt que le modificateur statique.

les variables statiques globales sont initialisées au moment de la compilation contrairement aux variables automatiques