error C2360: 'i' の初期化が 'case' ラベルによって行われませんでした。
VC++ の 6.0 ではしばしばこんなエラーに悩むことが
コンパイル中... baz.cpp C:\foo\bar\baz.cpp(999) : error C2360: 'i' の初期化が 'case' ラベルによって行われませんでした。 C:\foo\bar\baz.cpp(999) : 'i' の宣言を確認してください。 cl.exe の実行エラー
これをよくみるのはこんな風に、switch のなかで for 文を書いたときだったりする。
int foo (int number) { int ret = 0; switch (number) { default: for (int i = 0; i < number; i ++) { ret += i; } // FALLTHROUGH case 0: return ret; break; } }
これは、本来この i は for 文の中だけのスコープのはずが、ブロック終了後もスコープを持っているためである。このコンパイルエラーも意味は、この例で言うと、case 0: にジャンプした際、i が初期化されていないままになってしまう、という意味であるようだ。VC++ 6.0が準拠しているC++の規格が若干古いためらしい。g++ でコンパイルする場合は、上の例は正である。
回避方法は、for 文全体をブロック内に入れてしまう。
int foo (int number) { int ret = 0; switch (number) { default: { for (int i = 0; i < number; i ++) { ret += i; } } // FALLTHROUGH case 0: return ret; break; } }
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/218
コメント