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.