IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
next up previous contents index
Next: Définition de types Up: Les déclarations Previous: Classes de mémoire

Sous-sections

La compilation séparée

     

Généralités

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 >>.

Méthode des réfs et des défs

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.

Méthode du common

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.

La méthode du langage C

  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

Les contraintes

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 ;

En pratique

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

  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 up previous contents index
Next: Définition de types Up: Les déclarations Previous: Classes de mémoire
Bernard Cassagne
1998-12-09