Les variables globales (pas static
) sont là lorsque vous créez le fichier .o
disponible pour l'éditeur de liens pour une utilisation dans d'autres fichiers. Par conséquent, si vous avez deux fichiers comme celui-ci, vous obtenez une collision de nom sur a
:
ac:
#include <stdio.h>
int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
bc:
int a;
int compute(void)
{
a = 0;
return a;
}
parce que l'éditeur de liens ne sait pas quel mondial a
s à utiliser. Toutefois, lorsque vous définissez des globals statiques, vous demandez au compilateur de conserver la variable uniquement pour ce fichier et de ne pas en informer l'éditeur de liens. Donc, si vous ajoutez static
(dans la définition de a
) vous n'obtiendrez les collisions de noms simplement les deux exemples de codes que j'ai écrit, parce que l'éditeur de liens ne sait même pas qu'il y ait un a
dans l'un des fichiers:
ac:
#include <stdio.h>
static int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
bc:
static int a;
int compute(void)
{
a = 0;
return a;
}
Cela signifie que chaque fichier fonctionne avec son propre a
sans connaître les autres.
Comme une note de côté, il est correct d'avoir un d'entre eux static
et l'autre pas aussi longtemps qu'ils sont dans des fichiers différents. Si deux déclarations sont dans le même fichier (lire unité de traduction), une static
et une extern
, voir this answer.
Poster le code ... – Nawaz
Avez-vous un exemple? – glglgl
Si les deux variables sont déclarées statiques dans des fichiers différents, cela ne devrait pas provoquer de collision de noms.Je viens d'effectuer un test rapide et cela fonctionne comme prévu. Si cela ne fonctionne pas pour vous, veuillez poster le code où il ne fonctionne pas comme prévu, ce que vous attendez et ce que vous obtenez, et quel compilateur vous utilisez. – Kevin