< int foo(1); | CTime と struct tm の挿入子 >

March 1, 2004

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

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?