![]()
Les espaces de noms ![]()
![]()
![]()
![]()
![]()
Suivant: Durée de vie Début: Les déclarations Précédent: Visibilité des identificateurs
Paragraphes
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 nomi
, la première désigne lei
des1
, et la seconde désigne lei
des2
. 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 lei
des1
et lei
des2
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.
30/9/1997