2013-04-08 4 views
18

Cコードのコンパイル中に、私は、次のエラーメッセージが表示されました:CプロジェクトをC99モードでコンパイルする方法は?

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

+1

forループから初期化を引き出します。 – Mysticial

+8

コンパイラは、エラーメッセージでそれを修正する方法を示しています。 – chris

答えて

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 

それとも、あなたは標準のメイクファイルを使用している場合、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 

それとも、あなたは標準のメイクファイルを使用している場合、CFLAGS変数に追加します。

6

文と変数の宣言を混在させるには、C99が必要です。他の答えとエラーメッセージ自体が言うように、C99の機能[1]を有効にするためにコンパイルするときには、コマンドラインに-std=c99を追加してください。

しかし、1つのステートメントの代わりに複合ステートメント("ブロック"、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'の違いは何ですか?例えば; 'Introduction to GCC'の' 3.3.3'は '-std = c89'、' -std = iso9899'、 '-std = c99'を与えています。私は 'C90 'を見ませんでした。 –

+1

ANSI委員会は1989年に最初のC標準を採択しました.ISO委員会は1990年に同じ基準を採用しました。これは同じことです。 –

+1

はい。元のANSI委員会は、国際社会のためのスタンダードを準備するために非常に頑張った。 ISO委員会が行ったわずかな変更があったが、ANSI委員会はその変更を採用した。彼らはまったく同じです。そう、はい、彼らは交換可能に使用することができます(しかし、誰かが混乱している場合、同じであると説明する準備ができています:)。 –

関連する問題