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.
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; }
#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.