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