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?

The.Anti.9
quelle

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 .

OysterD
quelle
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.

JamesSugrue
quelle
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!

akelec
quelle
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.

Blorgbeard ist raus
quelle
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

Imran
quelle
6

wenn Sie in C ändern kompilieren

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

zu

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

Sie können auch mit dem Schalter C99 kompilieren. Fügen Sie -std = c99 in die Kompilierungszeile ein:

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
quelle
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"
Nerz
quelle
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;
        }

}
Jihene Stambouli
quelle
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...
Dunkler Bau
quelle
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 '
Jobayer Ahmmed
quelle
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
demiurg_spb
quelle