Deux variables avec le même nom et le même type, dans deux fichiers .c différents, compilées avec gcc

Voici le deal. J’ai eu deux variables globales identiques dans deux fichiers .c différents, elles n’ont pas été déclarées en tant qu’extern. Ainsi, chaque fichier .c aurait dû voir sa propre variable, non?

Mais j’ai eu un comportement vraiment étrange, comme si un fichier lisait les variables de fichiers autres (après les avoir reliées ensemble). L’ajout d’un qualificatif ‘statique‘ aux définitions des deux variables a semblé résoudre ce problème.

Donc, ce que je me demande réellement, c’est ce qui s’est exactement passé sans le qualificatif ‘statique’?

Ainsi, chaque fichier .c aurait dû voir sa propre variable, non?

Faux. En C, l’omission de static dans une déclaration signifie extern lien extern implicite.

De C en quelques mots:

Le compilateur traite les déclarations de fonction sans spécificateur de classe de stockage comme si elles incluaient le spécificateur extern. De même, tous les identificateurs d’object que vous déclarez en dehors de toutes les fonctions et sans spécificateur de classe de stockage ont external linkage .

TOUJOURS initialiser la variable globale, le compilateur ne considérera pas automatiquement son lien comme externe. Le compilateur générera une erreur lors de la compilation.

Cela aidera à éviter les problèmes aléatoires dans les bases de code volumineuses, car notre code peut utiliser une autre variable déclarée ayant une valeur aléatoire (dans notre perspective logique).

Le fichier de sortie est généré en créant un fichier object de fichier individuel, puis en les liant entre eux par un éditeur de liens. Maintenant, lorsque vous avez une variable identique dans deux fichiers différents, un fichier individuel sera compilé sans erreur, mais au moment de la liaison, l’éditeur de liens aura deux définitions de variable et générera une erreur. Mais dans le cas de la scope statique des deux variables limitées pour le fichier, tout fonctionne correctement. J’espère que vous trouverez cela utile.

Autant que je sache, lorsque vous ne spécifiez ni statique ni extern, il appartient au compilateur de choisir. Et gcc dans ce cas va pour extern, vous devez donc spécifier static dans votre cas.

J’ai eu le même problème, il y a quelques années 🙂