Domanda

Se ho avuto il seguente codice:

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

Poi, dopo, mi ha scritto quanto segue:

myvar = 0;
var2 = 0;

Vorrei che sia legale? Il mio VC ++ 6 lo compila correttamente, ma credo che questo dovrebbe essere illegale. (Dà un errore del compilatore in uno dei miei altri compilatori.)

È stato utile?

Soluzione

VC6 è piuttosto vecchio, e non sempre ... rigida ... nella sua applicazione dello standard :-) In realtà trapelato portata in determinate circostanze come:

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

Questo ha portato ad alcuni funky macro magia per aggirare questo problema. Se stai usando un compilatore ISO-conforme, entrambe queste cose si tenta di fare è illegale.

Da ISO C ++ 11 3.3.3/1, trattare con l'introduzione di portata blocco con {...}:

  

Un nome dichiarato in un blocco è locale a tale blocco; ha portata blocco. La sua portata potenziale comincia nel punto di dichiarazione e termina alla fine del suo blocco.

Sezione 6.5.3 riguarda la portata delle variabili "creati" da una dichiarazione for:

  

Se il for-init-statement è una dichiarazione, il campo del nome (s) dichiarata si estende fino alla fine della for-statement.

Altri suggerimenti

No, non sarebbe (§3.3.2 ambito locale):

  
      
  1. Un nome dichiarato in un blocco (6.3) è locale a quel blocco. Il suo potenziale   portata inizia nel suo punto di   dichiarazione (3.3.1) e termina alla   fine della sua regione dichiarativa.
  2.   

I consiglia di utilizzare i compilatori rilasciati negli ultimi dieci anni.

che dovrebbe essere illegale, ma VC6 è stato molto male in questo.

In Visual Studio 2005, una nuova impostazione a livello di progetto è stato introdotto denominato "conformità Force nel ciclo for Scope" . Questo affrontato il problema e fornito compatibilità pure. Il che significa che le basi di codice più anziani potrebbe compilare nelle nuove versioni di Visual Studio attraverso la disattivazione di questa impostazione.

Tuttavia, una cosa che MS ha fatto proprio nel VS2005 per attivare questo su di default di conseguenza, venendo un po 'più vicino agli standard.

  

Vorrei che sia legale? Il mio VC ++ 6 lo compila correttamente, ma credo che questo dovrebbe essere illegale.

No non dovrebbe essere legale. Dump VC ++ 6. Utilizzare un nuovo e migliore compilatore.

VC ha richiesto circa un decennio per implementare ambito adeguato per le variabili dichiarate in cicli e istruzioni condizionali. Generalmente non si può fare affidamento sul giudizio VC6' per quanto riguarda C ++.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top