web-dev-qa-db-fra.com

Quand utiliser un 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;

Cela devrait-il avoir static devant const ou non? Quelles sont les meilleures pratiques d'utilisation de static?

62
Matt Rajca

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

49
Dirk Eddelbuettel

Vous ne devez pas définir les 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 externe dans le fichier d'en-tête inclus par tous les fichiers .c qui en ont besoin.

Exemple:

  • exemple.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;
    }
    
90
Tomek Szpakowicz

Oui, utilisez l'électricité statique

Utilisez toujours statique dans .c fichiers sauf si vous devez référencer l'objet à partir d'un autre .c module.

N'utilisez jamais d'électricité statique dans .h fichiers, car vous créerez un objet différent à chaque fois qu'il sera inclus.

21
DigitalRoss

Règle générale pour les fichiers d'en-tête:

  • déclarer la variable comme extern int foo; et placez une initialisation correspondante dans un seul fichier source pour obtenir une valeur modifiable partagée entre les unités de traduction
  • utilisation static const int foo = 42; pour obtenir une constante qui peut être insérée
8
Christoph

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.

Par exemple. imaginez que vous souhaitez 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 var est statique, vous ne pouvez pas y accéder de n'importe où sauf du module où foo.c est compilé dans.

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

4
AraK

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

Vérifiez ceci: Linkage | nité de traduction

3
p.j

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

0
rmn