Pregunta

Si tuviera el siguiente código:

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

A continuación, después me escribió lo siguiente:

myvar = 0;
var2 = 0;

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

¿Fue útil?

Solución

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

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

Esto llevó a algunos cobarde macro magia para solucionar este problema. Si está utilizando un compilador ISO-conformes, las dos cosas que tratamos de hacer es ilegal.

Desde 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; que tiene ámbito de bloque. Su ámbito de aplicación potencial comienza en su punto de declaración y termina en el final de su bloque.

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

  

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

Otros consejos

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

  
      
  1. Un nombre declarado en un bloque (6,3) es local a ese bloque. su potencial   alcance comienza en su punto de   declaración (3.3.1) y termina en el   final de su región declarativa.
  2.   

Le recomiendo que use compiladores autorizados en la última década.

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

En Visual Studio 2005, un nuevo ajuste de nivel de proyecto se introdujo el nombre "conformidad Fuerza de Alcance Para bucle" . Esta abordó el problema y proporciona compatibilidad con versiones anteriores también. Lo que significa que las bases de código mayores podrían compilar en nuevas versiones de Visual Studio a través deshabilitar esta configuración.

Sin embargo, una cosa que la EM hizo bien en VS2005 para activar esta activada de forma predeterminada, por lo tanto, viene un poco más cerca de los estándares.

  

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

No debería ser ilegal. Dump VC ++ 6. Utilice una nueva y mejor compilador.

VC tomó cerca de una década para poner en práctica el propio ámbito variables declaradas en bucles y sentencias condicionales. En general, no se puede depender de un juicio VC6' con respecto a C ++.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top