2010-11-02 7 views
9

Si tuviera el siguiente código:Mira variable en C++

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

Entonces, después me escribió lo siguiente:

myvar = 0; 
var2 = 0; 

sería eso legal? Mi VC++ 6 lo compila correctamente, pero creo que esto debería ser ilegal. (Se da un error de compilación en uno de mis otros compiladores.)

+4

"Mi VC++ 6 lo compila correctamente", no, no. – avakar

+0

@todas las respuestas, tengo VC++ 6 solo en una computadora; en mi otro, tengo VC++ 2008EE. Estoy obligado a usar VC++ 6. :) –

Respuesta

10

VC6 es bastante antiguo, y no siempre ... ... en su rígida aplicación de la norma :-) En realidad filtró alcance en ciertas circunstancias como:

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

Esto llevó a algunos funky macro magic para solucionar este problema. Si está utilizando un compilador conforme a ISO, ambas cosas que intenta hacer son ilegales.

De ISO C++ 11 3.3.3/1, que trata de la introducción de alcance bloque con {...}:

Un nombre declarado en un bloque es local a ese bloque; tiene alcance de bloque. Su alcance potencial comienza en su punto de declaración y finaliza al final de su bloque.

Sección 6.5.3 cubre el ámbito de las variables "creado" por una declaración for:

Si el for-init-statement es una declaración, el alcance del nombre (s) declarado extiende hasta el final de la for-statement .

+1

Creo que te refieres a C++ 0x. –

17

No, no habría (§3.3.2 ámbito local):

  1. Un nombre declarado en un bloque (6.3) es local a ese bloque. Su alcance potencial comienza en su punto de la declaración (3.3.1) y termina en el extremo de su región declarativa.

Te recomiendo que uses los compiladores publicados en la última década.

1

¿Sería eso legal? My VC++ 6 lo compila correctamente, pero creo que esto debería ser ilegal.

No, no debería ser legal. Dump VC++ 6. Use un compilador nuevo y mejor.

1

VC tomó aproximadamente una década para implementar el alcance adecuado para las variables declaradas en bucles y enunciados condicionales. En general, no puede confiar en el juicio de VC6 con respecto a C++.

4

Eso debería ser ilegal pero VC6 era muy malo en eso.

En Visual Studio 2005, se introdujo un nuevo ajuste de nivel de proyecto llamado "conformidad Fuerza en bucle for Alcance".Esto solucionó el problema y también proporcionó compatibilidad con versiones anteriores. Lo que significa que las bases de códigos anteriores podrían compilarse en versiones más nuevas de Visual Studio mediante la desactivación de esta configuración.

Sin embargo, una cosa que MS hizo bien en VS2005 para activar esto por defecto, por lo tanto, acercándose un poco a los estándares.