Comment corriger l'erreur GCC «pour la déclaration initiale de la boucle utilisée en dehors du mode C99»?


117

J'essaye de résoudre le problème 3n + 1 et j'ai une forboucle qui ressemble à ceci:

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

        }

Malheureusement, j'obtiens cette erreur lorsque j'essaye de compiler avec GCC:

3np1.c: 15: erreur: déclaration initiale de la boucle 'for' utilisée en dehors du mode C99

Je ne sais pas ce qu'est le mode C99. Des idées?

Réponses:


149

J'essaierais de déclarer en idehors de la boucle!

Bonne chance pour résoudre 3n + 1 :-)

Voici un exemple:

#include <stdio.h>

int main() {

   int i;

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

   return 0;
}

En savoir plus sur les boucles en C ici .


alors pourquoi n'utilisez-vous pas la boucle while à la place?
Erik W

3
@ErikW votre question est très mauvaise
user25

119

Il existe un commutateur de compilateur qui active le mode C99 , qui permet entre autres de déclarer une variable dans la boucle for. Pour l'activer, utilisez le commutateur du compilateur-std=c99

Ou comme @OysterD le dit, déclarez la variable en dehors de la boucle.


7
en fait -std = gnu99 est probablement plus souhaitable puisque de cette façon, vous obtenez toujours des extensions gcc (par défaut gcc est -std = gnu89, mais cela changera en gnu99 à un moment donné dans les prochaines versions)
Spudd86

4
@ Spudd86: Que vous voulez activer les extensions de gcc dépend de ce que vous faites. Les désactiver est utile si votre objectif est d'écrire du code portable vers des compilateurs autres que gcc.
Keith Thompson

21

Pour passer en mode C99 dans CodeBlocks , procédez comme suit:

Cliquez sur Options de projet / construction , puis dans l'onglet Paramètres du compilateur, choisissez le sous-onglet Autres options , et placez-le -std=c99dans la zone de texte, puis cliquez sur OK .

Cela va tourner C99 mode pour votre compilateur.

J'espère que cela aidera quelqu'un!


Cela a aidé dans les blocs de code 16.1 sous les autres options du compilateur ! Bien que j'aie utilisé -std=gnu99comme décrit dans certaines réponses ci-dessus!
Ankur Shah

Mais cela a aidé temporairement! Je dois le faire à chaque fois que je compile du code! ... :(
Ankur Shah

Non tu n'as pas! Cela ne doit être fait qu'une seule fois pour chaque nouveau projet.
akelec

14

J'ai aussi eu cette erreur.

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

n'est pas valide dans la norme C89 / C90. Comme le dit OysterD, vous devez faire:

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

Votre code d'origine est autorisé dans les normes C99 et ultérieures du langage C.


3
Pour gcc, lancez-le "-std = c99". Pour des fonctionnalités supplémentaires, voir la réponse d'Imran.
Matt J

Oui, c'est un C valide; ce n'est tout simplement pas valide C89 / C90.
Keith Thompson

@KeithThompson: clarifié.
Blorgbeard sort le

Vous dites toujours que ce n'est pas un C valide, seulement avec une qualification. C'est parfaitement valide C; la norme de 1999 a remplacé et remplacé la norme de 1990, et la norme de 2011 a remplacé et remplacé la norme de 1999 (bien que cette dernière n'existait pas lorsque vous avez initialement publié cette réponse).
Keith Thompson

@KeithThompson Eh bien, ce n'est pas ce que je pensais dire. Considérez-vous que "n'est pas valide dans la norme C89 / C90" correct?
Blorgbeard sort le

13

@Blorgbeard :

Nouvelles fonctionnalités du C99

  • fonctions en ligne
  • la déclaration de variable n'est plus limitée à la portée du fichier ou au début d'une instruction composée
  • plusieurs nouveaux types de données, y compris un long long int, des types d'entiers étendus facultatifs, un type de données booléen explicite et un type complexe pour représenter des nombres complexes
  • tableaux de longueur variable
  • prise en charge des commentaires sur une ligne commençant par //, comme dans BCPL ou C ++
  • nouvelles fonctions de bibliothèque, telles que snprintf
  • nouveaux fichiers d'en-tête, tels que stdbool.h et inttypes.h
  • fonctions mathématiques génériques de type (tgmath.h)
  • prise en charge améliorée de la virgule flottante IEEE
  • initialiseurs désignés
  • littéraux composés
  • prise en charge des macros variadiques (macros d'arité variable)
  • restreindre la qualification pour permettre une optimisation du code plus agressive

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

Une visite de C99


6

si vous compilez en C changez

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

à

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

Vous pouvez également compiler avec le jeu de commutateurs C99. Mettez -std = c99 dans la ligne de compilation:

gcc -std=c99 foo.c -o foo

REF: http://cplusplus.syntaxerrors.info/index.php?title= 'for'_loop_initial_declaration_used_outside_C99_mode


3

Pour quiconque tente de compiler du code à partir d'une source externe qui utilise un utilitaire de construction automatisé tel que Make , pour éviter d'avoir à traquer les appels de compilation explicites gcc, vous pouvez définir une variable d'environnement. Entrez sur l'invite de commande ou mettez .bashrc (ou .bash_profile sur Mac):

export CFLAGS="-std=c99"

Notez qu'une solution similaire s'applique si vous exécutez un scénario similaire avec une compilation C ++ qui nécessite C ++ 11, vous pouvez utiliser:

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

1

J'ai eu le même problème et ça marche il suffit de déclarer l' iextérieur de la boucle:

int i;

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

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

}

1

Jihene Stambouli a répondu plus directement à la question de l'OP ... La question était; pourquoi

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

produire l'erreur;

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

pour lequel la réponse est

for(int i = low...

devrait être

int i;
for (i=low...

1

Activer le mode C99 dans Code :: Blocks 16.01

  • Allez dans Paramètres -> Compilateur ...
  • Dans la section Drapeaux du compilateur de l' onglet Paramètres du compilateur , cochez la case « Faire en sorte que gcc suive la norme de langage C ISO 1999 [-std = c99] »

0

Pour Qt-creator: ajoutez simplement les lignes suivantes au fichier * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.