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?
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 .
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.
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!
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.
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
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
pour Qt-creator: il suffit d'ajouter les lignes suivantes à *.pro file...
QMAKE_CFLAGS_DEBUG = \
-std=gnu99
QMAKE_CFLAGS_RELEASE = \
-std=gnu99
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;
}
}
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"
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.