Comment puis-je corriger l'erreur GCC "for loop initial declaration used outside C99 mode"?

j'essaie de résoudre le problème 3n+1 et j'ai une boucle for qui ressemble à ceci:

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

        }

malheureusement je reçois cette erreur quand j'essaie de compiler avec GCC:

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

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

108
demandé sur Sina 2008-08-24 10:30:09

10 réponses

j'essaierais de déclarer i en dehors 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;
}

lire plus sur les boucles dans C ici .

135
répondu OysterD 2017-11-08 07:20:39

il y a un commutateur de compilateur qui active mode c99 , ce qui permet entre autres la déclaration d'une variable à l'intérieur de la boucle for. Pour l'activer, utilisez l'interrupteur du compilateur -std=c99

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

109
répondu JamesSugrue 2013-11-15 09:39:45

pour passer en mode C99 en mode CodeBlocks , suivre les étapes suivantes:

cliquez sur Project/Build options , puis dans l'onglet paramètres du compilateur choisissez la sous-table autres options , et placez -std=c99 dans la zone de texte, et cliquez sur Ok .

ce sera tourner C99 mode sur pour votre Compilateur.

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

20
répondu akelec 2017-04-02 12:17:30

j'ai eu cette erreur aussi.

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é en C99 et les standards ultérieurs de la langue C.

14
répondu Blorgbeard 2013-09-13 01:25:37

@Blorgbeard :

nouvelles caractéristiques en C99

  • fonctions en ligne
  • déclaration variable ne se limitant plus au domaine du dossier ou au début d'une déclaration composée
  • plusieurs nouveaux types de données, y compris long int long, les types d'entiers étendus facultatifs, un type de données booléen explicite, et un type complexe pour représenter des nombres complexes
  • tableaux à longueur variable
  • prise en charge des commentaires en une ligne commençant par//, comme dans BCPL ou C++
  • nouvelle bibliothèque de fonctions, telles que snprintf
  • nouveaux fichiers d'en-tête, tels que stdbool.h et inttypes.h
  • type-fonctions mathématiques génériques (tgmath.h)
  • support amélioré pour IEEE floating point
  • initialisateurs désignés
  • littérature composée
  • soutien pour les variadic macros (macros d'arité variable)
  • restreindre la qualification pour permettre une optimisation de code plus agressive

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

Un Tour de C99

13
répondu Imran 2017-05-23 12:34:18

si vous compilez en C change

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

à

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

vous pouvez également compiler avec le commutateur C99. Put-std=c99 dans la ligne de compilation:

gcc -std=c99 foo.c -o foo

réf: http://cplusplus.syntaxerrors.info/index.php?title= ' for '_loop_initial_declaration_used_outside_c99_mode

5
répondu Roberto Cuadros 2013-04-08 05:25:12

pour Qt-creator: il suffit d'ajouter les lignes suivantes à *.pro file...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
0
répondu demiurg_spb 2013-05-29 14:27:19

j'ai eu le même problème et ça marche il suffit de déclarer le i en dehors de la boucle:

int i;

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

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

}
0
répondu Jihene Stambouli 2013-09-12 23:32:33

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

export CFLAGS="-std=c99"

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

export CXXFLAGS="-std=c++11"
0
répondu Mink 2018-06-27 15:37:50

compilez simplement en mode C++. Vous n'avez pas besoin d'utiliser des classes pour utiliser C++. En gros, j'ai utiliser le C++ comme un "plus agréable C" :)

Je n'utilise presque jamais les classes et n'utilise jamais la méthode overiding.

-2
répondu boytheo 2009-11-21 13:52:50