Tout nom utilisé dans un fichier doit être dans la portée d'une déclaration.
Pour réaliser cela, le plus simple sera d'inclure, grâce au préprocesseur, des
fichiers de déclarations. De tels fichiers devront comporter des
déclarations,
mais, en principe, pas de définitions. A priori, pour une classe C
donnée,
on aura d'une part un fichier de d'entête des déclarations concernant cette
classe qu'on appellera, par exemple, C.h
, d'autre part le source du code
correspondant dans un fichier C.C. Pour utiliser cette classe dans un autre
fichier, on ajoutera en tête de ce fichier une ligne #include "C.h"
et on
appellera à l'édition de liens le module objet résultant de la compilation de
C.C
.
Il faut éviter que les fichiers d'entêtes contiennent autre chose que des déclarations :
fihier tete.h: class A{ //... public: //... }; A a; //attention définition !! void erreur(){//... } //attention définition !! fichier A.C: /* code source pour la class A */ #include "tete.h" //... fichier f.C /* utilsateur de la class A */ #include "tete.h //... A x;
Si CC -c a.C
crée un module objet a.o
,
une compilation CC f.C a.o
échouera à l'édition de liens car
a
et erreur
auront été définis deux fois.
Il est important de noter que le fichier d'entête pourra contenir des
définitions ou des déclarations de type (c'est l'objectif!), des déclarations de
constantes (qui n'ont pas de lien externe par défaut), des déclarations de
fonctions, des énumérations, des patrons (template), des macros du
préprocesseur, et des définitions de fonctions en ligne.
Notons aussi que les fonctions membres définies dans la classe sont
``inline
'', ce qui permet de les mettre dans le fichier d'entête.
En principe, on aura donc pour chaque classe A, d'une part un fichier d'inclusion A.h, contenant toutes les déclarations des membres et utilitaires pour A, et sera inclus dans tous les sources utilisant la classe A, et un fichier source A.C, contenant toutes les définitions correspondant à A.h, l'objet correspondant ( A.o) étant utilisé par l'éditeur de liens.
Comme une déclaration de classe peut elle-même inclure un fichier d'inclusion de déclaration d'une autre classe, il faut éviter d'inclure plusieurs fois le même fichier. Pour cela, on peut utiliser les variables du préprocesseur, par exemple pour une classe chaine, le fichier de déclaration pourra avoir la forme:
#ifndef __CHAINE #define __CHAINE // les définitions de la classe chaine #endif