「C99モード以外で使用されるforループの初期宣言」GCCエラーを修正するにはどうすればよいですか?


116

3n + 1の問題を解決しようとしていforますが、次のようなループがあります。

for(int i = low; i <= high; ++i)
        {
                res = runalg(i);
                if (res > highestres)
                {
                        highestres = res;
                }

        }

残念ながら、GCCでコンパイルしようとすると、このエラーが発生します。

3np1.c:15:エラー:C99モード以外で使用された 'for'ループの初期宣言

C99モードが何かわかりません。何か案は?

回答:


148

iループの外で宣言しようと思います!

3n + 1の解決に向けて頑張ってください:-)

次に例を示します。

#include <stdio.h>

int main() {

   int i;

   /* for loop execution */
   for (i = 10; i < 20; i++) {
       printf("i: %d\n", i);
   }   

   return 0;
}

Cのforループの詳細については、こちらをご覧ください


次に、代わりにwhileループを使用しないのはなぜですか。
エリックW

3
@ErikWあなたの質問は非常に悪いです
user25 '25

118

C99モードを有効にするコンパイラスイッチがあり、特にforループ内で変数を宣言できます。オンにするには、コンパイラスイッチを使用します-std=c99

または、@ OysterDが言うように、ループの外で変数を宣言します。


7
実際には-std = gnu99の方がおそらく望ましいでしょう。これは、gcc拡張機能を取得するためです(gccのデフォルトは-std = gnu89ですが、これは次のいくつかのバージョンのある時点でgnu99に変更されます)
Spudd86

3
Spudd86 @:あなたはどうかしたい gccの拡張を可能にするためには、何をやっているに依存します。それらを無効にすることは、gcc以外のコンパイラに移植可能なコードを書くことが目標である場合に役立ちます。
キース・トンプソン

21

切り替えるにはC99のモードでコードブロック、次の手順に従います。

クリックしてプロジェクト/ビルドオプション、タブで、コンパイラの設定サブタブを選択その他のオプションを、と場所を-std=c99テキストエリアに、クリックし、[OK]を

これにより、コンパイラのC99モードがオンになります。

これが誰かを助けることを願っています!


これは、Other Compilerオプションの下のコードブロック16.1で役立ちました!-std=gnu99上記のいくつかの回答に示されているように使用しましたが!
Ankur Shah

しかし、これは一時的に役立ちました!コードをコンパイルするたびにこれを実行する必要があります!... :(
Ankur Shah

いいえ、あなたはしていません!これは、新しいプロジェクトごとに1回だけ実行する必要があります。
akelec

14

私もこのエラーを受け取りました。

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

C89 / C90標準では無効です。OysterDが言うように、あなたはする必要があります:

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

元のコードは、C言語のC99以降の標準で許可されています。


3
gccの場合は、「-std = c99」をスローします。その他の機能については、Imranの回答を参照してください。
Matt J

はい、それは有効なCです。有効でないC89 / C90です。
キース・トンプソン

@KeithThompson:明確化。
Blorgbeardは2013

あなたはまだそれが有効なCではなく、資格があるとだけ言っています。それは完全に有効なCです。1999年の標準は1990年の標準に取って代わり、2011年の標準は1999年の標準に取って代わりました(ただし、この回答を最初に投稿したとき、後者は存在しませんでした)。
キース・トンプソン

@KeithThompsonまあ、それは私が言っていたと思っていたものではありません。「C89 / C90標準では無効です」と思いますか?
Blorgbeardは2013

13

@Blorgbeard

C99の新機能

  • インライン関数
  • 変数宣言は、ファイルスコープまたは複合ステートメントの開始に制限されなくなりました
  • long long int、オプションの拡張整数型、明示的なブールデータ型、複素数を表す複合型など、いくつかの新しいデータ型
  • 可変長配列
  • BCPLまたはC ++のように、//で始まる1行コメントのサポート
  • snprintfなどの新しいライブラリ関数
  • stdbool.hやinttypes.hなどの新しいヘッダーファイル
  • タイプジェネリック数学関数(tgmath.h)
  • IEEE浮動小数点のサポートの改善
  • 指定された初期化子
  • 複合リテラル
  • 可変個のマクロ(可変アリティのマクロ)のサポート
  • より積極的なコード最適化を可能にするために資格を制限する

http://en.wikipedia.org/wiki/C99

C99のツアー


6

Cの変更でコンパイルする場合

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

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

C99スイッチセットを使用してコンパイルすることもできます。コンパイル行に-std = c99を入れます。

gcc -std=c99 foo.c -o foo

REF:http : //cplusplus.syntaxerrors.info/index.php?title= 'for'_loop_initial_declaration_used_outside_C99_mode


3

Makeなどの自動ビルドユーティリティを使用する外部ソースからコードをコンパイルしようとする場合は、明示的なgccコンパイル呼び出しを追跡する必要がないように、環境変数を設定できます。コマンドプロンプトで入力するか、.bashrc(Macの場合は.bash_profile)に入力します。

export CFLAGS="-std=c99"

C ++ 11を必要とするC ++コンパイルで同様のシナリオを実行した場合、同様のソリューションが適用されることに注意してください。

export CXXFLAGS="-std=c++11"

1

私は同じ問題を抱えていてi、ループの外側を宣言するだけでうまくいきます:

int i;

for(i = low; i <= high; ++i)

{
        res = runalg(i);
        if (res > highestres)
        {
                highestres = res;
        }

}

1

Jihene StambouliがOPの質問に最も直接回答しました...質問は; どして

for(int i = low; i <= high; ++i)
{
    res = runalg(i);
    if (res > highestres)
    {
        highestres = res;
    }
}

エラーを生成します。

3np1.c:15: error: 'for' loop initial declaration used outside C99 mode

答えは

for(int i = low...

する必要があります

int i;
for (i=low...

1

Code :: Blocks 16.01でC99モードを有効にする

  • [設定] -> [ コンパイラ... ]に移動します。
  • ではコンパイラフラグのセクションコンパイラ設定 ]タブを選択し、チェックボックス「持っているが、1999 ISO C言語の標準に従ってくださいGCC [-std = C99]

0

Qt-creatorの場合:* .proファイルに次の行を追加するだけです...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.