Le code suivant est-il valide en C++?Ce code est-il valide en C++?
const int var = 10;
{
int var[var]; // why doesn't this give any error ?
}
Remarque: Le code compile sur mon compilateur g ++.
Le code suivant est-il valide en C++?Ce code est-il valide en C++?
const int var = 10;
{
int var[var]; // why doesn't this give any error ?
}
Remarque: Le code compile sur mon compilateur g ++.
Oui, le code est valide C++. Non-local var
est visible jusqu'au point de déclaration de var
local.
Donc int var[var]
définit un tableau local de 10 nombres entiers.
En l'état? Non. Si c'était dans le corps d'une fonction? Oui.
La première ligne déclare une constante entière nommée var
avec la valeur 10
.
Les accolades commencent un nouveau bloc. Dans ce bloc, une nouvelle variable est déclarée, nommée var
, qui est un tableau de int
avec une taille égale à la valeur de la constante entière précédemment déclarée var
(10
).
La clé est que var
fait référence à la première variable jusqu'à ce que après la deuxième variable nommée var
est entièrement déclarée. Entre le point-virgule suivant la deuxième déclaration et l'accolade fermante, var
fait référence à la deuxième variable. (S'il y avait un initialiseur pour la deuxième variable, var
commencerait à se référer à la deuxième variable immédiatement avant l'initialiseur.)
Lol - +1 pour le bit "dans le corps d'une fonction": P –
@Billy: Eh bien, je pense que c'est un peu important; si ce code était à l'espace de noms ou à la portée de la classe, vous deviez faire du bloc un espace de nom, une classe ou une fonction ou quelque chose comme ça ... –
@James McNellis: cacher un nom, ou l'une de mes caractéristiques les plus détestées. Vous pouvez passer des heures à essayer de comprendre ce qui ne va pas ... –
Oui le code est valide C++ Il est un concept de SCOPE: noms Hiding
const int var = 10;
{
int var[var]; // why doesn't this give any error ?
}
Je pense que ce lien efface le doute
en C++:
http://msdn.microsoft.com/en-US/library/9a9h7328%28v=VS.80%29.aspx
En C:
Si tu veux une connaissance approfondie à ce sujet: Optez pour ce lien, ici les informations est sur le point lexicales par rapport à la portée dynamique
http://en.wikipedia.org/wiki/Scope_%28programming%29
mais dans votre code: "Scope ::" de visibilité de var. Ici Il diffère comme variable locale et non-locale. Accolades intérieures {x = 1; } variable locale. où comme ici {y = 1; {x = 1;}}, ici il diffère.
liens utiles
http://msdn.microsoft.com/en-us/library/b7kfh662%28VS.80%29.aspx
http://www.awitness.org/delphi_pascal_tutorial/c++_delphi/c++_scope_variables.html
@BE: Je pense que les 3 premiers liens qui ont donné est clair.environ cet exemple> Le ramining pas besoin –
Pourquoi serait-il pas * * valable? –