La portée d'une déclaration est la region dans le texte
du programme où la déclaration
est pontentiellement visible
(autrement dit, pontentiellement utilisable).
Ces règles ont pour conséquence:
Nous changeons légèrement l'exemple:
procedure exemple is un : constant integer := 1; x,y : integer := 1; function succeseur(x:integer) return integer is begin return(x + un); end succeseur; begin y := x + succeseur(3); end exemple;
D'après ces règles:
La notion de portée nous dit où chaque déclaration
est pertinente, mais elle ne nous dit pas comme choisir
entre plusieurs déclarations pertinentes.
Visibilité de déclarations
La visibilité d'une
déclaration est la region du programme
où toute occurrence de l'identificateur est lié
par cette déclaration. En Ada, une déclaration est
visible partout dans sa portée, sauf si une autre
déclaration du même identificateur est introduite
dans l'espace de cette portée.
Ainsi, une déclaration est visible:
D'après ces règles on constate:
Masquage de déclarations
Une déclaration d'identificateur n'est pas forcément visible
dans toute sa portée.
Toute nouvelle déclaration de l'identificateur qui
se trouve dans la portée de la première, masque la
visibilité de celle-ci, dans toute la portée de la
deuxième déclaration. La première déclaration de l'identificateur
devient inaccesible (non visible)
dans toute la portée de la deuxième déclaration.
Dans l'exemple, les deux déclarations de x (celle globale et
celle
du paramètre formel) ont pour portée le corps de la fonction
successeur. Mais, seul le paramètre formel est
visible à l'intérieur
de la fonction. En effet, la déclaration globale de x
a pour portée tout le programme, y compris la fonction,
mais n'est pas visible dans celle-ci. On dit qu'elle est masquée
par la déclaration du paramètre x.
Exemple: Une fonction qui contient une fonction locale,
procedure exemple2 is a,b,c : integer; function somme_carres(x,y : integer) return integer is function carre(x : integer) return integer is begin return(x*x); end carre; z : integer; begin z := carre(x) + carre(y); return(z); end somme_carres; begin -- Lecture de a,b ... c := somme_carres(a,b); -- Affichage de c ... end exemple2;