2009-08-17 12 views
28

Czy ktoś może opracować następujący błąd GCC?C: dla deklaracji początkowej pętli int

$ 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: Jak przez mgłę pamiętam, że int i powinny być zadeklarowane przed for pętli. Powinienem powiedzieć, że szukam odpowiedzi, która daje historyczny kontekst standardu C.

+2

Sprawdź to poprzednie pytanie dotyczące deklaracji zmiennej C, aby uzyskać więcej informacji: http://stackoverflow.com/questions/288441/variable-declaration-placement-in-c –

Odpowiedz

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

to składnia wprowadzona w C99. Aby z niego skorzystać, musisz włączyć tryb C99, przekazując -std=c99 (lub nieco późniejszy standard) do GCC. Wersja C89 jest:

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

EDIT

Historycznie, język C zawsze zmuszony programistów zadeklarować wszystkie zmienne na pocz? Tku bloku. Więc coś takiego:

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

muszą być zapisane jako:

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

blok jest zdefiniowany jako:

block := '{' declarations statements '}' 

C99, C++, C# i Java umożliwiają deklarację zmiennych w dowolnym miejscu blok.

Prawdziwym powodem (zgadywania) jest przydzielanie wewnętrznych struktur (takich jak obliczanie rozmiaru stosu) w czasie ASAP podczas analizowania źródła C, bez przechodzenia na kolejne podanie kompilatora.

+3

Po prostu uwaga: podczas korzystania z wersji c99, don Zapomnijmy, że zadeklarowana zmienna jest lokalna dla bloku pętli for i nie będzie później, gdy zniknie z zakresu. – ely

+1

Dodatkowa notatka, która może mieć znaczenie historyczne. Jednym ze sposobów obejścia tej reguły przed standardem C99 było utworzenie bloku w ramach bloku. Użytkownik zadeklaruje zmienną w środku bloku i otoczy ją oraz kod, który użyłby go z większą liczbą wzmacniaczy {} –

+0

Warto również wspomnieć, że na przykład w nowych wersjach GCC, domyślna wersja C jest aktualizowana do bardziej zaktualizowana wersja niż C89 -> więc cały ten problem WONT stworzył błąd kompilacji ... (Używam gcc 5.4.0 na Ubuntu 16.04 i nie mam żadnych błędów kompilacji, a nie ostrzeżenia o tym fragmencie kod). –

8

Przed C99 trzeba było zdefiniować zmienne lokalne na początku bloku. C99 zaimportowało funkcję C++, dzięki której można mieszać lokalne definicje zmiennych z instrukcjami i definiować zmienne w wyrażeniach sterujących for i while.