2009-08-17 11 views
28

Kann jemand den folgenden gcc-Fehler näher erläutern?C: for loop int initial declaration

$ gcc -o Ctutorial/temptable.out temptable.c 
temptable.c: In function ‘main’: 
temptable.c:5: error: ‘for’ loop initial declaration used outside C99 mode 

temptable.c:

... 
/* print Fahrenheit-Celsius Table */ 
main() 
{ 
    for(int i = 0; i <= 300; i += 20) 
    { 
     printf("F=%d C=%d\n",i, (i-32)/9);   
    } 
} 

P. S: Ich erinnere mich vage, dass int i sollte vor einer for Schleife deklariert werden. Ich sollte feststellen, dass ich nach einer Antwort suche, die einen historischen Kontext des C-Standards gibt.

+2

Überprüfen Sie diese vorherige Frage im Zusammenhang mit C-Variablendeklaration für weitere Informationen: http://stackoverflow.com/questions/288441/variable-declaration-placement-in-c –

Antwort

59
for (int i = 0; ...) 

ist eine Syntax, die in C99 eingeführt wurde. Um es verwenden zu können, müssen Sie den C99-Modus aktivieren, indem Sie -std=c99 (oder einen späteren Standard) an GCC übergeben. Die C89-Version ist:

int i; 
for (i = 0; ...) 

EDIT

Historisch gesehen, immer die Sprache C-Programmierer gezwungen, die alle Variablen Beginn eines Blocks zu erklären. So etwas wie:

{ 
    printf("%d", 42); 
    int c = 43; /* <--- compile time error */ 

müssen neu geschrieben werden:

{ 
    int c = 43; 
    printf("%d", 42); 

ein Block ist definiert als:

block := '{' declarations statements '}' 

C99, C++, C# und Java erlauben Deklaration von Variablen überall in Ein Block.

Der wahre Grund (Raten) ist über die Zuweisung interner Strukturen (wie Berechnung Stack-Größe) ASAP während der Analyse der C-Quelle, ohne für einen anderen Compiler-Durchlauf gehen.

+3

Nur eine Anmerkung: Wenn Sie die c99-Version verwenden, don Vergessen Sie nicht, dass die deklarierte Variable für den For-Loop-Block lokal ist und danach nicht mehr existiert, wenn sie den Gültigkeitsbereich verlassen hat. – ely

+1

Eine zusätzliche Anmerkung, die von historischem Interesse sein kann. Eine Möglichkeit, diese Regel vor dem C99-Standard zu umgehen, war das Erstellen eines Blocks innerhalb eines Blocks. Du würdest eine Variable in der Mitte eines Blocks deklarieren und sie umgeben und sie mit mehr Armschienen codieren {} –

+0

Es ist auch erwähnenswert, dass zum Beispiel bei neuen Versionen von GCC die Standardversion von C aktualisiert wird eine aktuellere Version als C89 -> also erzeugt das ganze Problem WONT an erster Stelle einen Kompilierungsfehler ... (Ich benutze gcc 5.4.0 unter Ubuntu 16.04 und hatte keine Kompilierfehler, keine Warnungen für dieses Snippet von Code). –

8

Vor C99 mussten Sie die lokalen Variablen am Anfang eines Blocks definieren. C99 hat die C++ - Funktion importiert, mit der Sie lokale Variablendefinitionen mit den Anweisungen mischen können, und Sie können Variablen in den Steuerausdrücken for und while definieren.