Come posso correggere l'errore GCC "dichiarazione iniziale del ciclo for utilizzato al di fuori della modalità C99"?


116

Sto cercando di risolvere il problema 3n + 1 e ho un forciclo simile a questo:

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

        }

Purtroppo ricevo questo errore quando provo a compilare con GCC:

3np1.c: 15: errore: dichiarazione iniziale del ciclo "for" utilizzata al di fuori della modalità C99

Non so cosa sia la modalità C99. Qualche idea?

Risposte:


148

Proverei a dichiarare ial di fuori del ciclo!

Buona fortuna per aver risolto 3n + 1 :-)

Ecco un esempio:

#include <stdio.h>

int main() {

   int i;

   /* for loop execution */
   for (i = 10; i < 20; i++) {
       printf("i: %d\n", i);
   }   

   return 0;
}

Leggi di più sui cicli in C qui .


allora perché non usi invece il ciclo while?
Erik W

3
@ErikW la tua domanda è pessima
user25

118

C'è uno switch del compilatore che abilita la modalità C99 , che tra le altre cose permette la dichiarazione di una variabile all'interno del ciclo for. Per attivarlo, utilizzare l'opzione del compilatore-std=c99

O come dice @OysterD, dichiara la variabile al di fuori del ciclo.


7
in realtà -std = gnu99 è probabilmente più desiderabile poiché in questo modo si ottengono ancora estensioni gcc (gcc di default è -std = gnu89, tuttavia questo cambierà in gnu99 ad un certo punto nelle prossime versioni)
Spudd86

3
@ Spudd86: se vuoi abilitare le estensioni gcc dipende da cosa stai facendo. Disabilitarli è utile se il tuo obiettivo è scrivere codice che sia portabile su compilatori diversi da gcc.
Keith Thompson

21

Per passare alla modalità C99 in CodeBlocks , segui i passaggi successivi:

Fare clic su Opzioni progetto / compilazione , quindi nella scheda Impostazioni compilatore scegliere la sottoscheda Altre opzioni , posizionarla -std=c99nell'area di testo e fare clic su OK .

Questo attiverà la modalità C99 per il tuo compilatore.

Spero che questo possa aiutare qualcuno!


Ciò ha aiutato nei blocchi di codice 16.1 con le opzioni Altro compilatore ! Anche se ho usato -std=gnu99come illustrato in alcune risposte sopra!
Ankur Shah

Ma questo ha aiutato temporaneamente! Devo farlo ogni volta che compilo codice! ... :(
Ankur Shah

No non hai! Questo deve essere fatto per ogni nuovo progetto solo una volta.
akelec

14

Ho ricevuto anche questo errore.

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

non è valido nello standard C89 / C90. Come dice OysterD, devi fare:

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

Il codice originale è consentito in C99 e negli standard successivi del linguaggio C.


3
Per gcc, lanciarlo "-std = c99". Per ulteriori funzionalità, vedere la risposta di Imran.
Matt J,

Sì, è valido C; è solo non valido C89 / C90.
Keith Thompson

@KeithThompson: chiarito.
Blorgbeard uscirà il

Stai ancora dicendo che non è valido C, solo con una qualifica. È perfettamente valido C; lo standard del 1999 ha sostituito e sostituito lo standard del 1990, e lo standard del 2011 ha sostituito e sostituito lo standard del 1999 (sebbene quest'ultimo non esistesse quando hai pubblicato originariamente questa risposta).
Keith Thompson

@KeithThompson Beh, non è quello che pensavo di dire. Considereresti corretto "non è valido nello standard C89 / C90"?
Blorgbeard uscirà il

13

@Blorgbeard :

Nuove funzionalità in C99

  • funzioni inline
  • la dichiarazione di variabile non è più limitata all'ambito del file o all'inizio di un'istruzione composta
  • diversi nuovi tipi di dati, inclusi long long int, tipi interi estesi opzionali, un tipo di dati booleano esplicito e un tipo complesso per rappresentare numeri complessi
  • array di lunghezza variabile
  • supporto per commenti di una riga che iniziano con //, come in BCPL o C ++
  • nuove funzioni di libreria, come snprintf
  • nuovi file di intestazione, come stdbool.he inttypes.h
  • funzioni matematiche generiche di tipo (tgmath.h)
  • supporto migliorato per IEEE floating point
  • inizializzatori designati
  • letterali composti
  • supporto per macro variadiche (macro di arità variabile)
  • limitare la qualificazione per consentire un'ottimizzazione del codice più aggressiva

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

Un tour di C99



3

Per chiunque tenti di compilare codice da una fonte esterna che utilizza un'utilità di compilazione automatizzata come Make , per evitare di dover rintracciare le chiamate esplicite di compilazione gcc è possibile impostare una variabile di ambiente. Accedi al prompt dei comandi o inserisci .bashrc (o .bash_profile su Mac):

export CFLAGS="-std=c99"

Nota che una soluzione simile si applica se ti imbatti in uno scenario simile con la compilazione C ++ che richiede C ++ 11, puoi usare:

export CXXFLAGS="-std=c++11"

1

Ho avuto lo stesso problema e funziona devi solo dichiarare l' iesterno del ciclo:

int i;

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

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

}

1

Jihene Stambouli ha risposto direttamente alla domanda OP ... La domanda era; perché lo fa

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

produrre l'errore;

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

per cui la risposta è

for(int i = low...

dovrebbe essere

int i;
for (i=low...

1

Abilita la modalità C99 in Code :: Blocks 16.01

  • Vai su Impostazioni -> Compilatore ...
  • Nella sezione Flag del compilatore della scheda Impostazioni del compilatore , seleziona la casella di controllo " Fai seguire a gcc lo standard del linguaggio ISO C del 1999 [-std = c99] "

0

Per Qt-creator: aggiungi semplicemente le righe successive al file * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.