2010-11-02 6 views
9

Si je devais le code suivant:Portée variable en C++

for(int myvar = 0; myvar < 10; myvar++); 
if(1) 
{ 
    int var2 = 16; 
} 

Puis, plus tard, j'écrit ce qui suit:

myvar = 0; 
var2 = 0; 

Ne serait-ce légal? Mon VC++ 6 le compile correctement, mais je pense que cela devrait être illégal. (Il donne une erreur de compilation dans l'un de mes autres compilateurs.)

+4

"Mon VC++ 6 le compile correctement," non, il ne le fait pas. – avakar

+0

@all réponses, j'ai VC++ 6 seulement sur un ordinateur; de mon côté, j'ai VC++ 2008EE. Je suis obligé d'utiliser VC++ 6. :) –

Répondre

10

VC6 est assez vieux, et pas toujours ... rigide ... dans son application de la norme :-) En fait, il fuite portée dans certaines circonstances comme:

for (int i = 0; i < 10; i++) { } 
// You can still use 'i' here. 

Cela a conduit à un certain funky macro magic pour contourner ce problème. Si vous utilisez un compilateur conforme à la norme ISO, les deux choses que vous essayez de faire sont illégales.

De ISO C++ 11 3.3.3/1, portant sur l'introduction de la portée de bloc avec {...}:

Un nom déclaré dans un bloc est local à ce bloc; il a une portée de bloc. Sa portée potentielle commence à son point de déclaration et se termine à la fin de son bloc.

Section 6.5.3 couvre la portée des variables « créé » par une déclaration for:

Si la for-init-statement est une déclaration, la portée du nom (s) déclarée étend à la fin de la for-statement .

+1

Je pense que vous voulez dire C++ 0x. –

17

Non, ce ne serait pas (§3.3.2 portée locale):

  1. Un nom déclaré dans un bloc (6,3) est local à ce bloc. Son étendue potentielle commence à la déclaration (3.3.1) et se termine à l'extrémité de sa région déclarative.

Je recommande d'utiliser des compilateurs publiés au cours de la dernière décennie.

1

Est-ce que ce serait légal? Mon VC++ 6 le compile correctement, mais je pense que cela devrait être illégal.

Non, cela ne devrait pas être légal. Dump VC++ 6. Utilisez un nouveau et meilleur compilateur.

1

Il a fallu environ une décennie à VC pour implémenter la portée correcte des variables déclarées dans les boucles et les instructions conditionnelles. Généralement vous ne pouvez pas compter sur le jugement de VC6 concernant C++.

4

Cela devrait être illégal mais VC6 était très mauvais à cela.

Dans Visual Studio 2005, un nouveau paramètre de niveau projet a été introduit: "Forcer la conformité dans For-loop Scope".Cela a résolu le problème et fourni une compatibilité ascendante. Ce qui signifie que les anciennes bases de code pourraient compiler dans les nouvelles versions de Visual Studio en désactivant ce paramètre.

Cependant, une chose que MS a bien fait dans VS2005 pour l'activer par défaut d'ici, se rapprochant un peu plus des standards.