Question

Si je devais le code suivant:

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

Alors, après j'écrit ce qui suit:

myvar = 0;
var2 = 0;

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

Était-ce utile?

La solution

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 à une géniale macro magie pour contourner ce problème. Si vous utilisez un compilateur ISO-conforme, ces deux choses que vous essayez de le faire sont illégales.

De l'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. Son champ d'action potentiel 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éées" par une instruction for:

  

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

Autres conseils

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 potentiel   la portée commence à son point de   déclaration (3.3.1) et se termine à la   fin de sa région déclarative.
  2.   

Je vous recommandons d'utiliser les compilateurs publiés dans la dernière décennie.

Ce devrait être illégal, mais VC6 était très mal à cela.

Dans un cadre de Visual Studio 2005, un nouveau niveau de projet a été présenté nommé "conformité force dans la boucle for Scope" . Cela a abordé le problème et a fourni rétrocompatibilité ainsi. Ce qui signifie que les bases de code anciennes pourraient compiler dans les versions plus récentes de Visual Studio grâce à la désactivation de ce paramètre.

Cependant, une chose que MS a fait droit à VS2005 pour activer automatiquement par défaut donc, venir un peu plus près des normes.

  

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

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

VC a une dizaine d'années pour mettre en œuvre la portée appropriée pour les variables déclarées dans les boucles et instructions conditionnelles. En général, vous ne pouvez pas compter sur le jugement VC6' concernant C ++.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top