web-dev-qa-db-fra.com

Statique vs global

Si j'ai un fichier C comme ci-dessous, quelle est la différence entre i et j?

#include <stdio.h>
#include <stdlib.h>

static int i;
int j;

int main ()
{
    //Some implementation
}
63
Vijay

i a un lien interne, vous ne pouvez donc pas utiliser le nom i dans d'autres fichiers source (strictement des unités de traduction) pour faire référence au même objet.

j possède une liaison externe, vous pouvez donc utiliser j pour faire référence à cet objet si vous le déclarez extern dans une autre unité de traduction.

59
CB Bailey

i n'est pas visible en dehors du module; j est globalement accessible.

Autrement dit, un autre module, qui lui est lié, peut faire

extern int j;

et ensuite pouvoir lire et écrire la valeur dans j. Le même autre module ne peut pas accéder à i, mais pourrait en déclarer sa propre instance, même globale, qui n'est pas visible pour le premier module.

21
wallyk

La différence est que i a un lien interne et j a un lien externe. Cela signifie que vous pouvez accéder à j à partir d'autres fichiers avec lesquels vous créez un lien, tandis que i n'est disponible que dans le fichier où il est déclaré.

4
Hans W

i aura liaison statique, c'est-à-dire que la variable n'est accessible que dans le fichier actuel.

j doit être défini comme extern, c'est-à-dire

extern int j;

dans un autre fichier d'en-tête (.h), puis il aura lien externe, et peut être consulté sur plusieurs fichiers.

3
Ramakrishna

La portée de la variable/fonction statique se trouve dans le même fichier bien que vous incluez le fichier dans un autre fichier source.

La portée de la variable globale se trouve dans tous les fichiers dans lesquels elle est incluse. Pour inclure la variable dans un fichier source différent, nous utilisons extern avant la déclaration de variable. Dans ce cas, aucune mémoire n'est à nouveau allouée à la variable.

extern est utilisé pour déclarer une variable C sans la définir. Le mot-clé extern étend la visibilité des variables C et des fonctions C. Les fonctions étant visibles par défaut dans le programme, l'utilisation de extern n'est pas nécessaire dans la déclaration/définition de fonction. Son utilisation est redondante.

1
Sravya