C言語でのローカル変数宣言は、ブロックの途中でも宣言可能らしい(C99)

    C++の勉強をしていると、こんなことをよく言われる。

    C++では、ローカル変数はメソッド内のどこでも宣言できる。C言語はブロックの先頭で宣言しなければいけない。そこがCとC++の差だ。

    実は、そんなことはなかった!C言語でも、ローカル変数を関数内のどこでも宣言できる。

    むかしは、ローカル変数は関数の頭で宣言しないといけなかった。しかし、C99で仕様拡張があった。

    C99以降のC言語ではローカル変数を関数内のどこでも宣言できるようになったらしい。スコープは、その宣言された直後から開始される。ただし、VisualC++2008/2010/2012 のいずれも、この機能には対応してい無いらしい(これは未検証」

    たとえば、こんなのもエラーしない・・・?

    #include <stdio.h>
    int main(void)
    {
      printf("hogehoge\n");
      for(int i=0; i<10; i++)   printf("%d",i);
    }

    エラーした。

    $ gcc local_val.c
    local_val.c: 関数 ‘main’ 内:
    local_val.c:4:3: エラー: ‘for’ ループ初期化宣言は C99 モード内でのみ許可されています
       for(int i=0; i<10; i++)   prinntf("%d",i);

    コンパイラは、 gcc 4.8を利用。

    $ gcc --version
    gcc (GCC) 4.8.1

    こんどは、C99をサポートするコンパイルオプションをつけると通った。

    $ gcc -std=c99 local_val.c

    リーダブルコードでも、スコープを狭めたほうが可読性が上がるし、こっちの仕様のほうがいいな。