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, ..."
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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."
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."
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."
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
Anthony Fleury <fleury_anthony@_hotmail_.com> 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.
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
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
Anthony Fleury <fleury_anthony@_hotmail_.com> 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.
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
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/
Dans le message vpqacr3auad.fsf@ecrins.imag.fr,
Anthony Fleury <fleury_anthony@_hotmail_.com> 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 mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
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/
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.
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.
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.
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, ..."
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, ..."
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, ..."