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?

Le.Anti.9
la source

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 .

HuîtreD
la source
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.

JamesSugrue
la source
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!

Akelec
la source
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.

Blorgbeard est sorti
la source
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

Imran
la source
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

Roberto Cuadros
la source
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"
Vison
la source
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;
        }

}
Jihene Stambouli
la source
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...
Terrier sombre
la source
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] »
Jobayer Ahmmed
la source
0

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
demiurg_spb
la source