2009-08-17 217 views
28

有人可以詳細說明下面的gcc錯誤嗎?C:for循環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:我依稀記得,int i應該在for循環之前進行聲明。我應該說我正在尋找一個給出C標準歷史背景的答案。

+2

查看此前有關C變量聲明的問題以獲取更多信息:http://stackoverflow.com/questions/288441/variable-declaration-placement-in-c – 2009-08-17 13:12:20

回答

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

是在C99中引入的語法。爲了使用它,您必須通過將-std=c99(或稍後的標準)傳遞給GCC來啓用C99模式。在C89版本是:

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

編輯

歷史上,C語言總是在被迫程序員聲明所有變量的開始塊。因此,像:

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

必須被改寫爲:

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

塊被定義爲:

block := '{' declarations statements '}' 

C99,C++,C#和Java允許變量聲明的任何地方一個塊。

真正的原因(猜測)是關於在解析C源代碼時儘快分配內部結構(如計算堆棧大小),而不需要進行另一次編譯器傳遞。

+3

只需注意:使用c99版本時,不要不要忘記聲明的變量對於for循環塊來說是本地的,並且當它超出作用域時不會再存在。 – ely 2016-03-30 02:42:57

+1

可能有歷史意義的附加註釋。在C99標準之前,圍繞這條規則的一個方法就是在塊內創建一個塊。您會在塊的中間聲明一個變量,並將其包含在代碼中,並將其與更多護腕一起使用。{} – 2016-12-29 05:40:46

+0

還值得一提的是,例如,在新版本的GCC上,C的默認版本更新爲一個更新的版本,然後C89 - >所以這個整個問題WONT首先創建一個編譯錯誤...(我在Ubuntu 16.04上使用gcc 5.4.0,並沒有任何編譯錯誤,不警告這個片段碼)。 – 2017-10-11 08:35:23

8

在C99之前,您必須在塊的開始處定義局部變量。 C99導入了C++功能,您可以將局部變量定義與指令混合在一起,並且您可以在forwhile控制表達式中定義變量。