• このエントリーをはてなブックマークに追加

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

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