IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
next up previous contents index
Next: Portée des déclarations Up: Les déclarations Previous: Les déclarations

Sous-sections

Déclarations de définition et de référence

  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.

Les déclarations de définition

Ce sont celles que l'on utilise dans la grande majorité des cas : on définit un objet et ensuite on l'utilise.

Les déclarations de référence

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.

Déclarations de variables

  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);
}

Déclarations d'étiquettes de structures et union

              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 up previous contents index
Next: Portée des déclarations Up: Les déclarations Previous: Les déclarations
Bernard Cassagne
1998-12-09