web-dev-qa-db-ja.com

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

どういう意味ですか?

修正方法

22
mpluse

あなたはこれをしました:

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

そして、これをこれに変更する必要があります:

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

または、エラーが言うように、

オプション-std = c99または-std = gnu99を使用して、コードをコンパイルします。

更新Ryan Foxの回答からコピー

gcc -std=c99 foo.c -o foo

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

32
Blorgbeard

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

ただし、複合ステートメント(a "block"、IOWを記述することは常に許可されていますが、標準ではこのWordを使用しません!)単一のステートメント。

#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、同じこと)、andC99で有効です。

C99モードを有効にすると、多くの cool stuff が得られますが、gccがデフォルトで許可する他のクールなもの(構造体と共用体内の匿名構造体と共用体など)も無効になります。

  1. -std=gnu99はおそらく「すべてのグッズ」を有効にしますが、これを行わないように注意してください。あなた(または他の人)がコードを移植したい場合、それは不必要な困難をもたらします。もし私がこれをやらなかったら、誰かに無料で移植された私のペットプロジェクトのWindowsバージョンがあるでしょう。それはあなたのgccを結び付けます。あなたは縛られたくありません。これが標準の血なまぐさいポイントです。
6
luser droog

他の回答は、GCCのデフォルトモードを処理するための回避策を提供します。 C99を使用したい場合(これは一般的にお勧めします)、そのコンパイラフラグを追加する必要があります。

gcc -std=c99 foo.c -o foo

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

5
Ryan Fox

forステートメントで変数を宣言できないことを意味します。

やったほうがいい:

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

おそらくあなたがしていること

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