Un programme C est une suite de définitions et/ou de déclarations.
On appelle déclaration le fait d'informer le compilateur qu'un objet existe et de lui associer un nom.
On appelle définition le fait de demander au compilateur de créer un objet et de lui associer un nom. Une définition est aussi, de fait, une déclaration. En général, une définition réserve de l'espace en mémoire pour stocker l'objet défini.
Un même objet peut en général être déclaré plusieurs fois mais, par contre, il doit être défini une fois et une seule. Toute les déclarations et la définition d'un même objet doivent être identiques (les déclarations et la définition traitent du même objet si elles utilisent le même nom).
Attention : selon les ouvrages et auteurs, les notions de définition et de déclaration peuvent être inversées ! Si vous employez ces notions dans un document, pensez à préciser au lecteur dans quel sens vous les utilisez et surtout restez cohérent tout au long de votre texte.
Les types ne sont jamais définis (puisqu'ils ne réservent pas d'espace
en mémoire). Par contre un même type (struct
ou typedef
)
ne doit être déclaré qu'une fois par fichier source.
Nous avons déjà vu comment définir une fonction. Pour la
déclarer, il suffit d'écrire le type de la fonction suivi de
son nom et de la liste de ses paramètres sans mettre le corps
de la fonction elle-même et en terminant la déclaration par un
point-virgule. La ligne suivante déclare la fonction
moyenne
:
double moyenne(double a, double b);
À partir du moment où cette déclaration est faite, la fonction
moyenne
est utilisable. Sa définition peut apparaître
plus tard ou même dans un autre fichier source.
Nous avons déjà vu comment définir des variables. Pour faire
juste une déclaration d'une variable qui sera définie plus
tard ou dans un autre fichier source, il faut précéder la
définition du mot-clé extern
. Ainsi, les deux lignes
suivantes déclarent que a
et b
existent sans
leur réserver d'espace en mémoire :
extern char a[100];
extern double *b;
À partir du moment où ces déclarations sont faites, le
compilateur peut utiliser a
et b
puisqu'il
connaît leur type.
La norme définit une notion de portée d'un nom. La portée d'un nom représente la région (ou les régions) dans le programme source où un nom est connu du compilateur.
Les fonctions définies dans un fichier source C sont visibles
(et donc utilisables) dans tout le programme sauf si leur
définition est précédée du mot-clé static
. Dans ce
dernier cas, la fonction n'est visible que dans le fichier
source la contenant.
Les variables définies à l'intérieur d'un bloc (au début le corps d'une fonction par exemple ou plus généralement au début d'une série d'instructions entourée par des accolades) ne sont visibles qu'à l'intérieur de ce bloc. À l'extérieur de ce bloc, le nom peut être réutilisé pour un autre objet.
Les variables définies à l'extérieur de toutes les fonctions
(et donc à l'extérieur de tous les blocs) sont appelées des
variables globales. Elles sont visibles dans tout le programme
sauf si leur définition est précédée du mot-clé
static
. Dans ce cas, la variable n'est utilisable que
dans le fichier source la contenant.