Programmer en langage C
112
© Éditions Eyrolles
9.2 Les variables globales et l’édition de liens
Supposons que nous ayons compilé les deux fichiers source précédents et voyons d’un peu
plus près comment l’éditeur de liens est en mesure de rassembler correctement les deux modules
objet ainsi obtenus. En particulier, examinons comment il peut faire correspondre au symbole x
du second fichier source l’adresse effective de la variable x définie dans le premier.
D’une part, après compilation du premier fichier source, on trouve, dans le module objet correspondant, une indication associant le symbole x et son adresse dans le module objet. Autrement
dit, contrairement à ce qui se produit pour les variables locales, pour lesquelles ne subsiste
aucune trace du nom après compilation, le nom des variables globales continue à exister au
niveau des modules objet. On retrouve là un mécanisme analogue à ce qui se passe pour les
noms de fonctions, lesquels doivent bien subsister pour que l’éditeur de liens soit en mesure de
retrouver les modules objet correspondants.
D’autre part, après compilation du second fichier source, on trouve dans le module objet
correspondant, une indication mentionnant qu’une certaine variable de nom x provient de
l’extérieur et qu’il faudra en fournir l’adresse effective.
Ce sera effectivement le rôle de l’éditeur de liens que de retrouver dans le premier module
objet l’adresse effective de la variable x et de la reporter dans le second module objet.
Ce mécanisme montre que s’il est possible, par mégarde, de réserver des variables globales
de même nom dans deux fichiers source différents, il sera, par contre, en général, impossible
d’effectuer correctement l’édition de liens des modules objet correspondants (certains éditeurs
de liens peuvent ne pas détecter cette anomalie). En effet, dans un tel cas, l’éditeur de liens
se trouvera en présence de deux adresses différentes pour un même identificateur, ce qui est
illogique.
9.3 Les variables globales cachées - la déclaration static
Il est possible de « cacher » une variable globale, c’est-à-dire de la rendre inaccessible à
l’extérieur du fichier source où elle a été définie (on dit aussi « rendre confidentielle » au lieu
de « cacher » ; on parle alors de « variables globales confidentielles »). Il suffit pour cela d’utiliser
la déclaration static comme dans cet exemple :
static int a ;
main()
{
.....
}
fct()
{
.....
}
Delannoy Livre.book Page 112 Mercredi, 6. mai 2009 4:26 16
112
© Éditions Eyrolles
9.2 Les variables globales et l’édition de liens
Supposons que nous ayons compilé les deux fichiers source précédents et voyons d’un peu
plus près comment l’éditeur de liens est en mesure de rassembler correctement les deux modules
objet ainsi obtenus. En particulier, examinons comment il peut faire correspondre au symbole x
du second fichier source l’adresse effective de la variable x définie dans le premier.
D’une part, après compilation du premier fichier source, on trouve, dans le module objet correspondant, une indication associant le symbole x et son adresse dans le module objet. Autrement
dit, contrairement à ce qui se produit pour les variables locales, pour lesquelles ne subsiste
aucune trace du nom après compilation, le nom des variables globales continue à exister au
niveau des modules objet. On retrouve là un mécanisme analogue à ce qui se passe pour les
noms de fonctions, lesquels doivent bien subsister pour que l’éditeur de liens soit en mesure de
retrouver les modules objet correspondants.
D’autre part, après compilation du second fichier source, on trouve dans le module objet
correspondant, une indication mentionnant qu’une certaine variable de nom x provient de
l’extérieur et qu’il faudra en fournir l’adresse effective.
Ce sera effectivement le rôle de l’éditeur de liens que de retrouver dans le premier module
objet l’adresse effective de la variable x et de la reporter dans le second module objet.
Ce mécanisme montre que s’il est possible, par mégarde, de réserver des variables globales
de même nom dans deux fichiers source différents, il sera, par contre, en général, impossible
d’effectuer correctement l’édition de liens des modules objet correspondants (certains éditeurs
de liens peuvent ne pas détecter cette anomalie). En effet, dans un tel cas, l’éditeur de liens
se trouvera en présence de deux adresses différentes pour un même identificateur, ce qui est
illogique.
9.3 Les variables globales cachées - la déclaration static
Il est possible de « cacher » une variable globale, c’est-à-dire de la rendre inaccessible à
l’extérieur du fichier source où elle a été définie (on dit aussi « rendre confidentielle » au lieu
de « cacher » ; on parle alors de « variables globales confidentielles »). Il suffit pour cela d’utiliser
la déclaration static comme dans cet exemple :
static int a ;
main()
{
.....
}
fct()
{
.....
}
Delannoy Livre.book Page 112 Mercredi, 6. mai 2009 4:26 16
