Next: Définition de types
Up: Les déclarations
Previous: Classes de mémoire
Sous-sections
Dès que l'on programme une application un peu conséquente, il devient
nécessaire pour des raisons pratiques d'en fractionner le source en plusieurs
unités de compilation.
Chaque unité est compilée séparément, puis les binaires obtenus sont
liés à l'aide d'un éditeur de liens pour créer le programme désiré.
Pour permettre cela, le langage doit disposer d'un moyen d'exprimer que
certaines variables ou procédures sont partagées par plusieurs unités de
compilation.
La méthode la plus répandue pour résoudre ce problème est la méthode
dite << des réfs et des défs >>.
Pour le seul cas des variables, il existe une autre méthode
dite << du
common >>.
Dans cette méthode les déclarations sont dissymétriques : certaines
déclarations sont des définitions, et d'autres déclarations sont des
références.
Une seule unité de compilation doit définir un nom,
et plusieurs unités de compilation peuvent le référencer.
Dans cette méthode, les variables partagées sont déclarées comme appartenant
à un segment spécial, appelé
common.
Toute variable du
common est référençable par n'importe quelle
unité de compilation.
C'est la méthode utilisée par
FORTRAN.
C'est un joyeux mélange des deux !
En effet, le langage permet de définir, référencer et mettre dans le
common.
La distinction entre ces trois cas se fait de la manière suivante :
Si la déclaration |
Il s'agit d'une |
comporte un initialisateur (avec ou sans mot-clé extern) |
définition |
comporte le mot-clé extern mais pas d'initialisateur |
référence |
ne comporte ni initialisateur ni le mot-clé extern |
mise dans le
common |
Exemples :
La déclaration |
est une |
extern int i = 1; |
définition |
int i = 1; |
définition |
extern int i; |
référence |
int i; |
mise dans le common |
Au moment de l'édition de liens, pour un identificateur donné,
n unités de compilation l'auront défini,
p l'auront référencé, et
q auront demandé une mise dans le
common.
Les contraintes sont les suivantes :
- -
- n doit valoir 0 ou 1 : au plus une unité de compilation doit
définir un nom ;
- -
- si n vaut 0, alors q ne peut être nul : il ne peut pas y
avoir que des références.
Voyons les choses sous l'angle de ce qui est autorisé.
On peut avoir :
- -
- une définition avec p (évent. 0) références, et q
(évent. 0) demandes de mise dans le common ;
- -
- p (évent. 0) références et q (non 0) demandes
de mise dans le common.
Ceci fait beaucoup de possibilités dont deux seulement sont << raisonnables >> :
- -
- une définition avec que des références : on adhère strictement à la
méthode des réfs et des défs ;
- -
- que des demandes de mise dans le common : on adhère strictement à la
méthode du common.
Ces deux méthodes sont résumées dans le tableau suivant :
méthode |
unité de compilation 1 |
unité de compilation 2 |
... |
unité de compilation
n |
réfs défs |
int i = 0; |
extern int i; |
... |
extern int i |
common |
int i ; |
int i ; |
... |
int i ; |
Les bons auteurs recommandent de s'en tenir à la stricte méthode des réfs et
défs, mais la lecture de nombreux sources montre que c'est la méthode du
common qui a la faveur des programmeurs.
Cette méthode à en effet un avantage pratique : dans toutes les unités de
compilations, la déclaration d'un nom est strictement la même.
Cette déclaration pourra donc être mise dans un fichier qui sera inclus (par
#include) dans toutes les unités de compilation qui utilisent ce nom.
La méthode des réfs et des défs par contre, impose d'avoir au moins deux
déclarations différentes pour un même nom : une pour la définition
et une autre (qui peut être dans un fichier d'inclusion) pour la référence.
Le cas des fonctions est plus simple dans la mesure où il n'y a pas de mise
dans le
common.
Les fonctions adhèrent donc strictement à la méthode des réfs et des défs,
avec une distinction facile à faire : comme on l'a vu en
9.1.2, si une déclaration de fonction
comporte une partie instruction c'est une définition, sinon c'est une référence.
Next: Définition de types
Up: Les déclarations
Previous: Classes de mémoire
Bernard Cassagne
1998-12-09