¿Cómo soluciono el error GCC "para la declaración inicial de bucle utilizada fuera del modo C99"?
Pregunta
Estoy tratando de resolver el problema 3n + 1 y tengo un para
que tiene este aspecto:
for(int i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
Desafortunadamente, recibo este error cuando intento compilar con GCC:
3np1.c: 15: error: 'for' loop initial declaración utilizada fuera del modo C99
No sé qué es el modo C99. ¿Alguna idea?
Solución
¡Intentaría declarar i
fuera del bucle!
Buena suerte al resolver 3n + 1 :-)
Aquí hay un ejemplo:
#include <stdio.h>
int main() {
int i;
/* for loop execution */
for (i = 10; i < 20; i++) {
printf("i: %d\n", i);
}
return 0;
}
Lea más en for loops en C aquí .
Otros consejos
Hay un interruptor del compilador que habilita el modo C99 , que entre otras cosas permite la declaración de un variable dentro del bucle for. Para activarlo, use el conmutador del compilador -std=c99
O como dice @OysterD, declare la variable fuera del bucle.
Para cambiar al modo C99 en CodeBlocks , siga los siguientes pasos:
Haga clic en Proyecto / Opciones de compilación , luego en la pestaña Configuración del compilador elija la subpestaña Otras opciones , y coloque -std = c99
en el área de texto y haga clic en Aceptar .
Esto activará el modo C99 para tu compilador.
¡Espero que esto ayude a alguien!
También he recibido este error.
for (int i=0;i<10;i++) { ..
no es válido en el estándar C89 / C90. Como dice OysterD, tienes que hacer:
int i;
for (i=0;i<10;i++) { ..
Su código original está permitido en C99 y estándares posteriores del lenguaje C
.Nuevas funciones en C99
- funciones en línea
- declaración variable ya no está restringida al alcance del archivo o al inicio de una declaración compuesta
- varios tipos de datos nuevos, incluidos int largos largos, tipos enteros extendidos opcionales, un tipo de datos booleano explícito y un tipo complejo para representar números complejos
- matrices de longitud variable
- soporte para comentarios de una línea que comienzan con //, como en BCPL o C ++
- nuevas funciones de biblioteca, como snprintf
- nuevos archivos de encabezado, como stdbool.h e inttypes.h
- funciones matemáticas genéricas de tipo (tgmath.h)
- soporte mejorado para el punto flotante IEEE
- inicializadores designados
- literales compuestos
- soporte para macros variadic (macros de aridad variable)
- restringir la calificación para permitir una optimización de código más agresiva
si compilas en C cambio
for (int i=0;i<10;i++) { ..
a
int i;
for (i=0;i<10;i++) { ..
También puede compilar con el conjunto de interruptores C99. Ponga -std = c99 en la línea de compilación:
gcc -std=c99 foo.c -o foo
REF: http://cplusplus.syntaxerrors.info/index.php?title= 'for'_loop_initial_declaration_used_outside_C99_mode
Tuve el mismo problema y funciona, solo tienes que declarar i
fuera del bucle:
int i;
for(i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
Para cualquier persona que intente compilar código de una fuente externa que use una utilidad de compilación automática como Make , para evitar tener que rastrear las llamadas explícitas de compilación de gcc, puede establecer una variable de entorno. Ingrese en el símbolo del sistema o ingrese .bashrc (o .bash_profile en Mac):
export CFLAGS="-std=c99"
Tenga en cuenta que se aplica una solución similar si se encuentra con un escenario similar con la compilación de C ++ que requiere C ++ 11, puede usar:
export CXXFLAGS="-std=c++11"
Para Qt-creator: simplemente agregue las siguientes líneas al archivo * .pro ...
QMAKE_CFLAGS_DEBUG = \
-std=gnu99
QMAKE_CFLAGS_RELEASE = \
-std=gnu99
Jihene Stambouli respondió la pregunta de OP más directamente ... La pregunta era; por qué
for(int i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
produce el error;
3np1.c:15: error: 'for' loop initial declaration used outside C99 mode
para el cual la respuesta es
for(int i = low...
debería ser
int i;
for (i=low...