58

誰かが次のgccエラーについて詳しく説明できますか?

$ 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);        
    }
}

PS:ループint iの前に宣言する必要があることを漠然と思い出しました。forC標準の歴史的な文脈を与える答えを探していると述べておく必要があります。

4

2 に答える 2

99
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 ソースの解析中にできるだけ早く内部構造を割り当てること (スタック サイズの計算など) に関するものです。

于 2009-08-17T13:08:21.430 に答える
18

C99 より前は、ブロックの開始時にローカル変数を定義する必要がありました。forC99 は、ローカル変数定義と命令を混在させたり、およびwhile制御式で変数を定義したりできる C++ 機能をインポートしました。

于 2009-08-17T13:09:21.150 に答える