Wie behebe ich den GCC-Fehler "for-Schleifen-Anfangsdeklaration außerhalb des C99-Modus"?


116

Ich versuche das 3n + 1-Problem zu lösen und habe eine forSchleife, die so aussieht:

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

        }

Leider wird dieser Fehler angezeigt, wenn ich versuche, mit GCC zu kompilieren:

3np1.c: 15: Fehler: Die anfängliche Deklaration der 'for'-Schleife wird außerhalb des C99-Modus verwendet

Ich weiß nicht, was der C99-Modus ist. Irgendwelche Ideen?

Antworten:


148

Ich würde versuchen, iaußerhalb der Schleife zu deklarieren !

Viel Glück beim Lösen von 3n + 1 :-)

Hier ist ein Beispiel:

#include <stdio.h>

int main() {

   int i;

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

   return 0;
}

Lesen Sie mehr auf for - Schleifen in C hier .


Warum verwenden Sie dann nicht stattdessen die while-Schleife?
Erik W

3
@ErikW Ihre Frage ist sehr schlecht
user25

118

Es gibt einen Compiler-Schalter, der den C99-Modus aktiviert , der unter anderem die Deklaration einer Variablen innerhalb der for-Schleife ermöglicht. Verwenden Sie zum Einschalten den Compiler-Schalter-std=c99

Oder deklarieren Sie, wie @OysterD sagt, die Variable außerhalb der Schleife.


7
Tatsächlich ist -std = gnu99 wahrscheinlich wünschenswerter, da Sie auf diese Weise immer noch gcc-Erweiterungen erhalten (gcc ist standardmäßig -std = gnu89, dies wird sich jedoch in den nächsten Versionen irgendwann in gnu99 ändern)
Spudd86

3
@ Spudd86: Ob Sie gcc-Erweiterungen aktivieren möchten , hängt davon ab, was Sie tun. Das Deaktivieren ist hilfreich, wenn Sie Code schreiben möchten, der für andere Compiler als gcc portierbar ist.
Keith Thompson

21

Führen Sie die folgenden Schritte aus, um in CodeBlocks in den C99- Modus zu wechseln :

Klicken Sie auf Projekt- / Erstellungsoptionen, wählen Sie dann auf der Registerkarte Compilereinstellungen die Unterregisterkarte Andere Optionen aus , platzieren Sie sie -std=c99im Textbereich und klicken Sie auf OK .

Dadurch wird der C99- Modus für Ihren Compiler aktiviert.

Ich hoffe das hilft jemandem!


Dies half in Codeblocks 16.1 unter den anderen Compiler-Optionen ! Obwohl ich -std=gnu99wie in einigen Antworten oben dargestellt verwendet habe!
Ankur Shah

Aber das hat vorübergehend geholfen! Ich muss dies jedes Mal tun, wenn ich Code kompiliere! ... :(
Ankur Shah

Nein haben Sie nicht! Dies muss für jedes neue Projekt nur einmal durchgeführt werden.
Akelec

14

Ich habe diesen Fehler auch bekommen.

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

ist im C89 / C90-Standard nicht gültig. Wie OysterD sagt, müssen Sie Folgendes tun:

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

Ihr Originalcode ist in C99 und späteren Standards der C-Sprache zulässig.


3
Für gcc geben Sie "-std = c99" ein. Weitere Funktionen finden Sie in Imrans Antwort.
Matt J

Ja, es ist gültig C; Es ist einfach nicht gültig C89 / C90.
Keith Thompson

@ KeithThompson: geklärt.
Blorgbeard ist

Sie sagen immer noch, dass es kein gültiges C ist, nur mit einer Qualifikation. Es ist vollkommen gültig C; Der Standard von 1999 hat den Standard von 1990 ersetzt und ersetzt, und der Standard von 2011 hat den Standard von 1999 ersetzt und ersetzt (obwohl letzterer nicht existierte, als Sie diese Antwort ursprünglich veröffentlicht haben).
Keith Thompson

@ KeithThompson Nun, das habe ich nicht gesagt. Würden Sie "ist im C89 / C90-Standard nicht gültig" für richtig halten?
Blorgbeard ist

13

@ Blorgbeard :

Neue Funktionen in C99

  • Inline-Funktionen
  • Die Variablendeklaration ist nicht mehr auf den Dateibereich oder den Beginn einer zusammengesetzten Anweisung beschränkt
  • Mehrere neue Datentypen, darunter long long int, optionale erweiterte Ganzzahltypen, ein expliziter boolescher Datentyp und ein komplexer Typ zur Darstellung komplexer Zahlen
  • Arrays mit variabler Länge
  • Unterstützung für einzeilige Kommentare, die mit // beginnen, wie in BCPL oder C ++
  • neue Bibliotheksfunktionen wie snprintf
  • neue Header-Dateien wie stdbool.h und inttypes.h
  • typgenerische mathematische Funktionen (tgmath.h)
  • verbesserte Unterstützung für IEEE-Gleitkomma
  • bezeichnete Initialisierer
  • zusammengesetzte Literale
  • Unterstützung für verschiedene Makros (Makros mit variabler Arität)
  • Beschränken Sie die Qualifikation, um eine aggressivere Codeoptimierung zu ermöglichen

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

Eine Tour von C99



3

Für alle, die versuchen, Code aus einer externen Quelle zu kompilieren, die ein automatisiertes Build-Dienstprogramm wie Make verwendet , können Sie eine Umgebungsvariable festlegen, um zu vermeiden, dass die expliziten gcc-Kompilierungsaufrufe aufgespürt werden müssen. Geben Sie an der Eingabeaufforderung ein oder geben Sie .bashrc (oder .bash_profile auf dem Mac) ein:

export CFLAGS="-std=c99"

Beachten Sie, dass eine ähnliche Lösung gilt, wenn Sie auf ein ähnliches Szenario mit C ++ - Kompilierung stoßen, für das C ++ 11 erforderlich ist. Sie können Folgendes verwenden:

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

1

Ich hatte das gleiche Problem und es funktioniert. Sie müssen nur die iAußenseite der Schleife deklarieren :

int i;

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

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

}

1

Jihene Stambouli beantwortete die OP-Frage am direktesten ... Die Frage war; warum tut

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

den Fehler erzeugen;

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

für die die Antwort ist

for(int i = low...

sollte sein

int i;
for (i=low...

1

Aktivieren Sie den C99-Modus in Code :: Blocks 16.01

  • Gehen Sie zu Einstellungen -> Compiler ...
  • In Compiler - Flags Abschnitt Compiler - Einstellungen Registerkarte, wählen Sie Option ' Have gcc den 1999 ISO C Sprachstandard [-std = c99] folgen '

0

Für Qt-Creator: Fügen Sie einfach die nächsten Zeilen zur * .pro-Datei hinzu ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.