Next: Portée des déclarations
Up: Les déclarations
Previous: Les déclarations
Sous-sections
Il existe dans le langage C, deux types de déclarations :
- -
- les déclarations qui définissent complètement un objet,
ce sont les déclarations de définition ;
- -
- les déclarations qui
font référence à un objet défini ailleurs, ce sont les déclarations de
référence.
Ce sont celles que l'on utilise dans la grande majorité des cas : on définit
un objet et ensuite on l'utilise.
Elles sont nécessaires pour :
- -
- un nom de variable ou de fonction défini dans une
autre unité de compilation.
- -
- un nom de fonction défini dans la même unité de compilation, pour
résoudre le cas d'appel récursif :
la fonction f1 appelle f2 qui appelle f3, ...
qui appelle fn qui appelle f1.
- -
- un nom de structure ou d'union défini dans la même unité de compilation,
pour résoudre le cas de référence récursive : la struct s1 possède un
champ dont le type référence la struct s2 qui possède un champ dont
le type référence la struct s3 qui etc. jusqu'à revenir à la
struct s1.
Différences entre déclarations et définitions de variables :
- -
- une déclaration de référence est précédée du mot-clé extern ;
- -
- une déclaration de référence peut avoir un type incomplet : absence
de la taille d'un tableau.
Exemples :
int i; /* définition de i */
extern int j; /* référence à un entier défini ailleurs */
int t1[20]; /* définition de t */
extern t2[]; /* référence à un tableau t2 défini ailleurs */
Déclarations de fonctions
Une déclaration de fonction ayant la partie instruction est une définition,
une déclaration de fonction n'ayant pas de partie instruction est une
déclaration de référence.
La présence ou l'absence du mot-clé
extern dans l'un ou l'autre cas est
possible, mais on considère comme un bon style de programmation de le mettre
à une déclaration de référence et de l'omettre à une définition.
Exemples :
/* max n'a pas de partie instruction : déclaration de référence */
extern int max(int a, int b) ;
/* min possède la partie instruction : c'est une définition */
int min(int a, int b)
{
return(a < b ? a : b);
}
Attention : il ne s'agit pas de déclaration de noms de variables de type
structure ou union, mais de déclaration d'étiquette de structure ou union.
Quand on veut déclarer une étiquette de structure ou union
qui sera définie plus tard, on procède de la manière suivante :
struct str1; /* déclaration de référence de str1 */
struct str2 /* définition de str2 qui référence str1 */
{
...
struct str1 * p;
};
struct str1 /* définition de str1 qui référence str2 */
{
...
struct str2 *p;
};
Le mécanisme est le même avec les unions.
Next: Portée des déclarations
Up: Les déclarations
Previous: Les déclarations
Bernard Cassagne
1998-12-09