2013-04-08 101 views
18

我得到了以下錯誤消息在編譯的C代碼:如何在C99模式下編譯C項目?

error: 'for' loop initial declarations are only allowed in C99 mode 
note: use option -std=c99 or -std=gnu99 to compile your code 

是什麼意思?

如何解決?

+1

那麼,也許向你展示代碼將是一個好的開始。 – OldProgrammer 2013-04-08 02:57:45

+1

從for循環中取出初始化。 – Mysticial 2013-04-08 02:57:48

+8

編譯器說明如何在錯誤消息中修復它。 – chris 2013-04-08 02:58:14

回答

28

你已經做到了這一點:

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

而且你需要把它改成這樣:

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

或者,作爲錯誤說,

使用選項-std = c99或-std = gnu99來編譯你的代碼。

更新從瑞安福克斯的答案複製:

gcc -std=c99 foo.c -o foo 

或者,如果您使用的是標準Makefile,把它添加到CFLAGS變量。

2

這意味着你不能在for聲明中聲明變量。

你應該這樣做:

int i ; 
for(i = 0 ; i < len ; i++) 

什麼你可能做

for(int i = 0 ; i < len ; i++) 
3

其他的答案給你周圍的工作來處理GCC的默認模式。如果您想使用C99,(我不建議一般的),那麼你必須添加編譯標誌:

gcc -std=c99 foo.c -o foo 

或者,如果您使用的是標準的makefile,將其添加到CFLAGS變量。

6

如果要混合語句和變量聲明,仍然需要C99。正如其他答案和錯誤消息本身所述,在編譯啓用C99功能[1]時,將-std=c99添加到命令行中。

但是,您總是被允許編寫複合語句(「塊」,IOW,但標準從不使用此詞!)來代替單個語句。

#include<stdio.h> 
int main() { 
    int i = 5; 

    { /* new block, new declarations. */ 
     int i; 
     for (i=0;i<10;i++){ 
     } 
    } 
    printf("%d\n", i); /* prints "5\n" */ 
} 

這是以K &法律R,C90(又名C89,這是同樣的事情), C99。

啓用C99模式會獲得很多cool stuff,但它也會禁用默認情況下gcc允許的其他一些很酷的東西,如結構和聯合中的匿名結構和聯合。

  1. -std=gnu99可能使「所有的好東西」,但我提醒你,以避免這樣做。如果您(或其他人)希望移植代碼,將會產生不必要的困難。我可能有我的寵物項目的Windows版本,有人免費移植,如果我沒有做到這一點。它與你聯繫gcc。你不想被束縛。這是標準的全部血腥點。
+0

在你的帖子中你提到'C90'。 'C89'和'C90'有什麼區別?例如; 'GCC'介紹書的3.3.3節給出了'-std = c89','-std = iso9899'和'-std = c99'。我沒有看到「C90」。 – 2014-12-15 04:55:43

+1

1989年ANSI委員會採用了第一個C標準.ISO委員會在1990年採用了同樣的標準。它也是一樣的。 – 2014-12-15 05:00:35

+1

是的。最初的ANSI委員會非常努力地爲國際社會做好準備。 ISO委員會做了一些改變,但ANSI委員會採納了這些改變。所以他們完全一樣。所以,是的,它們可以互換使用(但要準備好解釋一下,如果有人感到困惑,它們是一樣的:)。 – 2014-12-15 05:17:09