2009-11-03 5 views

Répondre

18

Il y a quelques raisons d'utiliser static en C.

Lorsqu'il est utilisé avec les fonctions, oui l'intention est de créer l'abstraction. Le terme original pour la portée d'un fichier de code source C était "unité de traduction". Les fonctions statiques ne peuvent être atteintes qu'à partir de la même unité de traduction. Ces fonctions statiques sont similaires aux méthodes privées en C++, interprétées libéralement (dans cette analogie, une unité de traduction définit une classe).

Les données statiques au niveau global ne sont pas non plus accessibles depuis l'extérieur de l'unité de traduction, et elles sont également utilisées pour créer une abstraction. De plus, toutes les données statiques sont initialisées à zéro, donc static peut être utilisé pour contrôler l'initialisation.

La variable statique au niveau de la variable locale ("automatique") est utilisée pour extraire l'implémentation de la fonction qui maintient l'état entre les appels, mais évite d'utiliser une variable à la portée de l'unité de traduction. Encore une fois, les variables sont initialisées à zéro en raison de la qualification statique.

8

Le mot-clé static a plusieurs utilisations; En dehors d'une fonction, il limite simplement la visibilité d'une fonction ou d'une variable à l'unité de compilation (fichier .c) dans laquelle la fonction ou la variable intervient. Ainsi, la fonction ou la variable ne devient pas globale. C'est une bonne chose, ça promeut une sorte de "besoin de savoir" (ne pas exposer les choses qui n'ont pas besoin d'être exposées). Les variables statiques de ce type sont initialisées à zéro, mais bien sûr, les variables globales sont également initialisées à zéro, de sorte que le mot-clé statique n'est pas responsable de l'initialisation zéro en soi.

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 sur la pile à chaque invocation de la fonction. Au lieu de cela, la variable est allouée dans la zone de données statiques, elle est initialisée à zéro et persiste pendant toute la durée du programme. Si la fonction le modifie pendant une invocation, la nouvelle valeur modifiée sera disponible lors de l'invocation suivante. Cela semble être une bonne chose, mais il y a de bonnes raisons pour lesquelles "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 sont plus efficaces en termes de mémoire et sont essentielles si vous souhaitez que votre fonction soit sûre pour les threads.

6

static est utilisé comme storage class specifier et linkage specifier. En tant que spécificateur de liaison, il restreint la portée d'une variable ou d'une fonction globale à une seule unité de compilation. Cela permet, par exemple, à une unité de compilation d'avoir des variables et des fonctions avec les mêmes noms d'identifiants que les autres unités de compilation mais sans provoquer de conflit, puisque ces identifiants sont "cachés" à l'éditeur de liens. Ceci est utile si vous créez une bibliothèque par exemple et que vous avez besoin de fonctions internes 'helper' qui ne doivent pas provoquer de conflit avec le code utilisateur.

En tant que spécificateur de classe de stockage appliqué à une variable locale, il a des sémantiques entièrement différentes, mais votre question semble impliquer que vous faites référence à une liaison statique.

0

fonctions statiques en C

En C, les fonctions sont globales par défaut. Le mot-clé "static" avant un nom de fonction le rend statique. Par exemple, la fonction ci-dessous fun() est statique. Contrairement aux fonctions globales de C, l'accès aux fonctions statiques est limité au fichier où elles sont déclarées.Par conséquent, lorsque nous voulons restreindre l'accès aux fonctions, nous les rendons statiques. Une autre raison pour rendre les fonctions statiques peut être la réutilisation du même nom de fonction dans d'autres fichiers.

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

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

et stockons programme suivant dans un autre fichier fichier2.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 indéfinie à fun1’” . This is because fun1() is declared static` dans le fichier file1.c et ne peut pas être utilisée dans file2.c. Voir aussi le explanation here, d'où viennent les codes.

Questions connexes