2010-10-13 6 views
8

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 ++.

+0

Pourquoi serait-il pas * * valable? –

Répondre

5

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.

19

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.)

+0

Lol - +1 pour le bit "dans le corps d'une fonction": P –

+0

@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 ... –

+0

@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 ... –

1

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:

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fzexscope_c.htm

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

+0

@BE: Je pense que les 3 premiers liens qui ont donné est clair.environ cet exemple> Le ramining pas besoin –