C/Visual C - declaración implícita

 
Vista:

declaración implícita

Publicado por Nasón (40 intervenciones) el 12/08/2004 13:33:47
En C++, al utilizar un bucle for, es común declarar los índices de recorrido del bucle locales a este de la forma:
for(int i=0; i<max; i++)
{
//hacer cosas
}
De esta forma, i se destruye al terminar el bucle y si usásemos otro for habría que volver a declararlo.
Pues bien, cuando compilo con GCC no hay problemas, pero Visual C++ 6.0, ante dos bucles seguidos del estilo del expuesto más arriba da error por redefinición de la variable i. ¿Alguien puede resolver el problema?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:declaración implícita

Publicado por josema (35 intervenciones) el 12/08/2004 16:43:10
Este es un tema que ha llenado varias foros en internet y publicaciones especializadas. Unos dicen que la variable i está dentro del ámbito del for y por tanto es local al for; otros, que el ambito del for empieza en la primera llave { por tanto i está declarada antes del for, por lo que pertenece al ambito superior o a la funcion.
Visual C toma la primera acepción.
Solución.
Si quieres que el código te valga de un compilador a otro, crea tus propios ambitos para los bucles for

{
for (int i=0; i < nMax; i++)
{
...
}
}
{
for (int i=0; i < nMax2; i++ ) ;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:declaración implícita

Publicado por Googol (255 intervenciones) el 19/08/2004 01:08:59
Como dice Josema, este problema ha generado rios de tinta.
Al parecer, en el primer borrador del estandar de C++ se decía que el identificador i debía seguir existiendo más allá de la declaración del bucle, pero luego se cambió en la versión definitiva para que no fuera así.
Visual C++ 6.0 se quedó con la versión del borrador, no con la del estándar final, por lo que no hace lo que el resto de compiladores.

En algún sitio ví una solución ingeniosa (en realidad la ví antes de conocer el problema, y tardé en entenderla ;-) ):

#ifdef __VC6 // o como sea, que no me acuerdo
#define for if(false) {} else for
#endif

Un saludo

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar