Developpez.com - C
X

Choisissez d'abord la catégorieensuite la rubrique :

next up previous contents index
Next: Durée de vie Up: Les déclarations Previous: Visibilité des identificateurs

Sous-sections

   
Les espaces de noms

Position du problème

Il existe certaines situations où l'on peut accepter que le même nom désigne plusieurs objets différents, parce que le contexte d'utilisation du nom permet de déterminer quel est l'objet référencé. Considérons l'exemple suivant :
struct st1
   {
   int i;
   int j;
   };

struct st2
   {
   int i;
   double d;
   };

int main()
{
struct st1 s1;   /*   déclaration de la variable s1   */
struct st2 s2;   /*   déclaration de la variable s2   */

s1.i = s2.i;
}

Dans l'instruction s1.i = s2.i, il y a deux occurrence du nom i, la première désigne le i de s1, et la seconde désigne le i de s2. On voit que le contexte d'utilisation de i a permis de déterminer à chaque fois de quel i il s'agit. On dit alors que le i de s1 et le i de s2 appartiennent à des espaces de noms différents.

Les espaces de noms du langage C

Il y a quatre types d'espaces de noms dans le langage :
-
un espace pour les étiquettes de structures, d'unions et d'énumération ;

-
un espace pour les noms de champs de structures ou unions : il y a un espace de nom pour chaque structure et chaque union ;

-
un espace pour les étiquettes de branchement ;

-
le dernier espace est formé de tous les autres noms.

Nous donnons ci-dessous un exemple où le même identificateur i est utilisé de manière valide dans 5 espaces de noms différents.

int i;          /*   i est un nom d'identificateur      */

struct i        /*   i est une étiquette de structure   */
   {
   int i;       /*   i est un champ de la struct i      */
   int j;
   }i1,i2;

struct ii
   {
   int i;       /*   i est un champ de la struct ii     */
   int j;
   }ii1,ii2;

int main()
{
i:		/*   i est une étiquette de branchement */
i = 1;
i1.i = 2;
ii1.i = 3;
goto i;
}

Remarque

Certains auteurs considèrent également qu'il existe un espace de noms pour les noms définis à l'aide de la commande #define du macro-processeur. Nous avons refusé cette vision des choses dans la mesure où pendant la phase de compilation proprement dite, ces noms n'ont plus d'existence.


next up previous contents index
Next: Durée de vie Up: Les déclarations Previous: Visibilité des identificateurs
Bernard Cassagne
1998-12-09
Contacter le responsable de la rubrique C