Par défaut, les variables globales ont linkage externe, ce qui signifie qu'elles peuvent être utilisées par d'autres fichiers sources (ou «unités de traduction»). Si vous déclarez plutôt vos variables globales avec le mot-clé static
, elles auront liaison interne, ce qui signifie qu'elles ne seront pas utilisables par d'autres fichiers source.
Pour les variables avec liaison externe, vous ne pouvez pas avoir plusieurs variables avec le même nom, ou l'éditeur de liens va se plaindre. Vous pouvez cependant avoir deux variables avec le même nom, à condition qu'au moins l'une d'entre elles ait un lien interne, et bien sûr vous ne pouvez pas les référencer toutes les deux dans le même fichier source. Une déclaration extern
indique simplement au compilateur "voici le nom d'une variable avec une liaison externe définie dans une autre unité de traduction", ce qui vous permet de vous référer à cette variable.
C++ est exactement le même, sauf pour l'ajout d'espaces de noms. Si des variables globales sont placées dans un espace de noms, elles peuvent avoir le même nom sans erreurs de liens, à condition qu'elles se trouvent dans des espaces de noms différents. Bien sûr, toutes les références à ces variables doivent alors se référer au nom complet namespace::var_name
, ou utiliser une déclaration using
pour établir un contexte d'espace de noms local.
C++ a également des espaces de noms anonymes, qui sont entièrement équivalents à l'utilisation du mot clé static
pour les variables globales dans C: toutes les variables et fonctions déclarées dans un espace de noms anonyme ont une liaison interne.
Donc, pour répondre à votre question initiale, vous avez raison - la compilation réussirait, mais relier échouerait, en raison de multiples définitions de la x
variables avec une liaison externe (en particulier, des unités de traduction one.c
et two.c
).
De three.c
, il est impossible de se référer simultanément aux deux variables x
. Vous devrez renommer x
dans un ou deux modules, ou de passer à C++ et de mettre au moins un x
intérieur d'un espace de noms.
La déclaration de la variable devrait être en tête, et l'en-tête doit être utilisé dans chaque fichier qui fait référence à la variable, et il doit être utilisé dans le seul fichier (seul, solitaire) qui définit réellement la variable. Si vous essayez de lier du code avec deux définitions d'une seule variable globale, vous êtes en dehors du comportement standard et dans les extensions communes documentées dans la norme (Annexe J). –
Voir aussi: http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c/ –