¿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?

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í .


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.


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!


¡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.


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



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"

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;
        }

}

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...

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] '

0

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.