Next: Durée de vie
Up: Les déclarations
Previous: Visibilité des identificateurs
Sous-sections
Les espaces de noms
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.
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;
}
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: Durée de vie
Up: Les déclarations
Previous: Visibilité des identificateurs
Bernard Cassagne
1998-12-09