コード:
// a0.cpp
int main()
{
switch (0) {
case 0:
int a = 0;
break;
case 1:
break;
}
}
上記の C++ プログラム a0.cpp を Microsoft の Visual C++ でコンパイルすると
次のようなエラーメッセージが表示されます。
コード:
a0.cpp(8) : error C2360: 'a' の初期化が 'case' ラベルによって行われませんでした。
a0.cpp(6) : 'a' の宣言を確認してください。
エラーが出ないようにするには、次のようないくつかの方法があります。
a1.cpp -- case 0: と break; の間に { } を付ける。
a2.cpp -- a の初期化を宣言時に行わず、代入で行う。
a3.cpp -- case 1: break; を先に書く。
コード:
// a1.cpp
int main()
{
switch (0) {
case 0:
{
int a = 0;
}
break;
case 1:
break;
}
}
コード:
// a2.cpp
int main()
{
switch (0) {
case 0:
int a;
a = 0;
break;
case 1:
break;
}
}
コード:
// a3.cpp
int main()
{
switch (0) {
case 1:
break;
case 0:
int a = 0;
break;
}
}
以下、説明です。
a0.cpp は、8行目の case 1: のところがエラーです。
自動変数 a の有効範囲は、caseラベルとは無関係に、
6行目の int a = 0; から 10行目の } までです。
自動変数 a の初期化は、6行目を通らないと実行されません。
ということは、case 1: のラベルに飛んできた場合、
a は存在するのに、初期化されていないという状況になり、
C++ ではこれをエラーとして扱うことになっています。
a1.cpp は、case 1: のラベルのところでは a は存在しないので
エラーになりません。
a2.cpp は、int a; の宣言により、case 1: のところで a は存在していて、
宣言通り未初期化なのでエラーになりません。
a3.cpp は、case 1: のラベルのところでは、a は存在していないので
エラーになりません。
なお、C++ では、int a; や int a = 0; は宣言文という文なので、
ラベルを付けることができますが、
C では、int a; や int a = 0; は、宣言ではあるが、文ではないので
ラベルを付けることができず、a1.cpp 以外は全部エラーになります。
ただし、異なるエラーメッセージです。
コード:
error C2143: 構文エラー : ';' が '型' の前にありません。