web-dev-qa-db-ja.com

C:for loop intの初期宣言

誰かが次の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);        
    }
}

P.S:int iは、forループの前に宣言する必要があります。私は、C標準の歴史的背景を与える答えを探していると述べるべきです。

40
Midnight Blue
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ソースの解析中に、別のコンパイラパスを使用せずに、できるだけ早く内部構造(スタックサイズの計算など)を割り当てることです。

76
dfa

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

12
AProgrammer