¿Cómo soluciono el error GCC "para la declaración inicial del bucle utilizada fuera del modo C99"?

116

Estoy tratando de resolver el problema 3n + 1 y tengo un forbucle que se ve así:

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: declaración inicial de bucle 'for' utilizada fuera del modo C99

No sé qué es el modo C99. ¿Algunas ideas?

El.Anti.9
fuente

Respuestas:

148

¡Intentaría declarar ifuera del ciclo!

Buena suerte resolviendo 3n + 1 :-)

He aquí 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 sobre los bucles for en C aquí .

OysterD
fuente
entonces, ¿por qué no usas el bucle while en su lugar?
Erik W
3
@ErikW tu pregunta es muy mala
usuario25
118

Hay un conmutador de compilador que habilita el modo C99 , que entre otras cosas permite la declaración de una variable dentro del bucle for. Para activarlo, use el modificador del compilador-std=c99

O como dice @OysterD, declare la variable fuera del ciclo.

JamesSugrue
fuente
7
en realidad, -std = gnu99 es probablemente más deseable ya que de esa manera todavía obtienes extensiones gcc (gcc por defecto es -std = gnu89, sin embargo, esto cambiará a gnu99 en algún momento en las próximas versiones)
Spudd86
3
@ Spudd86: Si desea habilitar las extensiones gcc depende de lo que esté haciendo. Deshabilitarlos es útil si su objetivo es escribir código que sea portátil para compiladores distintos de gcc.
Keith Thompson
21

Para cambiar al modo C99 en CodeBlocks , siga los siguientes pasos:

Haga clic en Opciones de proyecto / compilación , luego en la pestaña Configuración del compilador, elija la subpestaña Otras opciones , colóquela -std=c99en el área de texto y haga clic en Aceptar .

Esto activará el modo C99 para su compilador.

¡Espero que esto ayude a alguien!

Akelec
fuente
¡Esto ayudó en los bloques de código 16.1 bajo las opciones de Otro compilador ! ¡Aunque usé -std=gnu99como se muestra en algunas respuestas anteriores!
Ankur Shah
¡Pero esto ayudó temporalmente! ¡Tengo que hacer esto cada vez que compilo código! ... :(
Ankur Shah
¡No, no lo tiene! Esto debe hacerse para cada nuevo proyecto solo una vez.
akelec
14

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, debe hacer:

int i;
for (i=0;i<10;i++) { ..

Su código original está permitido en C99 y estándares posteriores del lenguaje C.

Blorgbeard está fuera
fuente
3
Para gcc, arroja un "-std = c99". Para características adicionales, vea la respuesta de Imran.
Matt J
Sí, es válido C; simplemente no es válido C89 / C90.
Keith Thompson
@KeithThompson: aclarado.
Blorgbeard sale el
Sigues diciendo que no es una C válida, solo con una calificación. Es perfectamente válido C; el estándar de 1999 reemplazó y reemplazó al estándar de 1990, y el estándar de 2011 reemplazó y reemplazó al estándar de 1999 (aunque este último no existía cuando publicó originalmente esta respuesta).
Keith Thompson
@KeithThompson Bueno, eso no es lo que pensé que estaba diciendo. ¿Consideraría que "no es válido en el estándar C89 / C90" correcto?
Blorgbeard sale el
13

@Blorgbeard :

Nuevas funciones en C99

  • funciones en línea
  • la declaración de variable ya no está restringida al alcance del archivo o al comienzo de una declaración compuesta
  • varios tipos de datos nuevos, incluidos long long int, tipos de 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.hy inttypes.h
  • funciones matemáticas genéricas de tipo (tgmath.h)
  • soporte mejorado para punto flotante IEEE
  • inicializadores designados
  • literales compuestos
  • soporte para macros variadic (macros de arity variable)
  • restringir la calificación para permitir una optimización de código más agresiva

http://en.wikipedia.org/wiki/C99

Un recorrido por C99

Imran
fuente
6

si compila en C cambia

for (int i=0;i<10;i++) { ..

a

int i;
for (i=0;i<10;i++) { ..

También puede compilar con el conjunto de conmutadores 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

Roberto Cuadros
fuente
3

Para cualquiera que intente compilar código desde una fuente externa que use una utilidad de compilación automatizada 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 en un escenario similar con la compilación de C ++ que requiere C ++ 11, puede usar:

export CXXFLAGS="-std=c++11"
Visón
fuente
1

Tuve el mismo problema y funciona, solo tienes que declarar el iexterior del ciclo:

int i;

for(i = low; i <= high; ++i)

{
        res = runalg(i);
        if (res > highestres)
        {
                highestres = res;
        }

}
Jihene Stambouli
fuente
1

Jihene Stambouli respondió la pregunta de OP de manera más directa ... La pregunta fue; por que

for(int i = low; i <= high; ++i)
{
    res = runalg(i);
    if (res > highestres)
    {
        highestres = res;
    }
}

producir el error;

3np1.c:15: error: 'for' loop initial declaration used outside C99 mode

para lo cual la respuesta es

for(int i = low...

debiera ser

int i;
for (i=low...
Madriguera oscura
fuente
1

Habilite el modo C99 en Code :: Blocks 16.01

  • Vaya a Configuración -> Compilador ...
  • En la sección de banderas del compilador de la pestaña de configuración del compilador , seleccione la casilla de verificación ' Hacer que gcc siga el estándar de lenguaje C de ISO 1999 [-std = c99] '
Jobayer Ahmmed
fuente
0

Para Qt-creator: simplemente agregue las siguientes líneas al archivo * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
demiurg_spb
fuente