OVH Cloud OVH Cloud

Redeclaration de variable

6 réponses
Avatar
Remi Moyen
Bonjour,

J'ai découvert par hasard (et en me plantant, forcément...) qu'il était
légal, au moins avec gcc (3.3.5), de redéfinir dans un sous-bloc une
variable déjà définie dans un bloc parent.

Par exemple, le code suivant tourne parfaitement :

int i = 0 ;
{
int i = 42 ;
cout << i << endl ;
}
cout << i << endl ;

Et il affiche 42, puis 0.

Bon, je suppose qu'il y a une raison, mais en fait ce qui m'intéresse,
c'est surtout comment faire pour empêcher ce comportement ? Parce que pour
moi, c'est surtout une source d'erreur, lorsque je réutilise par mégarde
un nom déjà utilisé avant (code tapé rapidement, copier-coller,
toussa...).

Comme y'a des options pour tout dans gcc, je me dis qu'il y en a peut-être
une spécialement faite pour vérifier ce genre de choses ? J'ai regardé (un
peu rapidement, j'avoue...) le man de gcc/g++, et je n'ai rien vu à ce
sujet.

Merci d'avance !

PS : si c'est trop hors-sujet de causer de trucs spécifiques à gcc ici,
merci de rediriger vers le bon forum (fco.unix ?).
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."

6 réponses

Avatar
Anthony Fleury
Remi Moyen wrote:

Bonjour,


Bonjour,

J'ai découvert par hasard (et en me plantant, forcément...) qu'il était
légal, au moins avec gcc (3.3.5), de redéfinir dans un sous-bloc une
variable déjà définie dans un bloc parent.


Légal avec tout compilateur C++ conforme tout du moins. C'est autorisé par
la norme.

Par exemple, le code suivant tourne parfaitement :

int i = 0 ;
{
int i = 42 ;
cout << i << endl ;
}
cout << i << endl ;

Et il affiche 42, puis 0.


Normal.

Bon, je suppose qu'il y a une raison, mais en fait ce qui m'intéresse,
c'est surtout comment faire pour empêcher ce comportement ?


Je ne vois pas trop, vu que c'est légal. Ce n'est pas un comportement
bizarre pour le C++ qui considère que le code est vu dans "l'espace de
nommage" du bloc en question (ptite question, c'est bien légal de parler de
namespace dans ce cas ?). Donc il prend cette variable à la place de celle
du dessus. Certaines IDE doivent bien pouvoir rendre plus visible ce genre
d'erreur (avec le masquage de blocs ou autre...).

Comme y'a des options pour tout dans gcc, je me dis qu'il y en a peut-être
une spécialement faite pour vérifier ce genre de choses ? J'ai regardé (un
peu rapidement, j'avoue...) le man de gcc/g++, et je n'ai rien vu à ce
sujet.


Je ne vois pas trop, mais des gens plus calés que moi avec g++ pourront
peut-être répondre.

--
Anthony Fleury
"Il faut mieux avoir un dix à sa composition qu'un con à sa disposition."

Avatar
Matthieu Moy
Anthony Fleury writes:

Légal avec tout compilateur C++ conforme tout du moins. C'est autorisé par
la norme.


Et au passage, il y a ce genre de chose dans a peu près tous les
langages que je connais.

--
Matthieu

Avatar
Jean-Sebastien Mouret
Anthony Fleury writes:

Remi Moyen wrote:

Bonjour,


Bonjour,

J'ai découvert par hasard (et en me plantant, forcément...) qu'il était
légal, au moins avec gcc (3.3.5), de redéfinir dans un sous-bloc une
variable déjà définie dans un bloc parent.


[...]


Comme y'a des options pour tout dans gcc, je me dis qu'il y en a peut-être
une spécialement faite pour vérifier ce genre de choses ? J'ai regardé (un
peu rapidement, j'avoue...) le man de gcc/g++, et je n'ai rien vu à ce
sujet.




-Wshadow


--
js


Avatar
Michel Michaud
Dans le message ,
Anthony Fleury writes:

Légal avec tout compilateur C++ conforme tout du moins. C'est
autorisé par la norme.


Et au passage, il y a ce genre de chose dans a peu près tous les
langages que je connais.


C# étant l'exception dans la liste des langages semblables à C...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Marc Boyer
Remi Moyen wrote:
Bonjour,

J'ai découvert par hasard (et en me plantant, forcément...) qu'il était
légal, au moins avec gcc (3.3.5), de redéfinir dans un sous-bloc une
variable déjà définie dans un bloc parent.

Par exemple, le code suivant tourne parfaitement :

int i = 0 ;
{
int i = 42 ;
cout << i << endl ;
}
cout << i << endl ;

Et il affiche 42, puis 0.

Bon, je suppose qu'il y a une raison,


Oui, la notion de localité des identifiants, et tous les
languages avec déclaration explicite de variable que je
connais font de même.

mais en fait ce qui m'intéresse,
c'est surtout comment faire pour empêcher ce comportement ? Parce que pour
moi, c'est surtout une source d'erreur, lorsque je réutilise par mégarde
un nom déjà utilisé avant (code tapé rapidement, copier-coller,
toussa...).


Ben, qu'un langage ne soit pas adapté au copier-coller
brutal me semble plutôt une bonne chose.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
Remi Moyen
On Fri, 21 Jan 2005, Jean-Sebastien Mouret wrote:

J'ai découvert par hasard (et en me plantant, forcément...) qu'il était
légal, au moins avec gcc (3.3.5), de redéfinir dans un sous-bloc une
variable déjà définie dans un bloc parent.


[...]


Comme y'a des options pour tout dans gcc, je me dis qu'il y en a peut-être
une spécialement faite pour vérifier ce genre de choses ? J'ai regardé (un
peu rapidement, j'avoue...) le man de gcc/g++, et je n'ai rien vu à ce
sujet.




-Wshadow


Nickel. Merci pour ta réponse, c'est exactement ce qu'il me fallait. Ça me
permettra de contrôler mon code plus aisément.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."