switch文の途中で宣言する
普通に書くとswitch文の途中で変数を宣言することが出来ません。
例えば、以下の文はエラーになります。
switch( ... ) {
case 1:
int hoge; // コンパイルエラー
/* ・・・(略) */
break;
default:
// hogeのスコープはまだ有効
} // hogeのスコープはここで終了(括弧の終わり)
変数hogeのスコープは有効にもかかわらず、caseラベルが実行されないパターンではhogeが定義されません。コンパイラはエラーとせざるを得ないのです。
どうしてもswitch文で宣言したい場合、以下のようにスコープを限定すれば良いです。
switch( ... ) {
case 1:
{
int hoge; // コンパイル成功
} // hogeのスコープが終了
理由を考えたら当然ですが、defaultラベルにおける宣言は普通に出来ます。
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/147973/8019350
この記事へのトラックバック一覧です: switch文の途中で宣言する:







コメント
上記で「defaultラベルにおける宣言は可能」とありますが、厳密には「switch文の最後に記したラベルでの宣言は可能」ですよね。
ちなみにgcc(Cコンパイラ)では最後のラベルに記しても他のラベルと同じ理由でNGで、g++(C++コンパイラ)ではコンパイル可能でした。
ご参考まで。
投稿: KatokichiSoft | 2009/09/16 22:32:13
コメント有り難うございます。
なるほど、「defaultを最後書く」という固定観念で「本質」を見落としていたようです。
ちなみに、コメント内容をVisual Studio 2005で実験したところ、GNUコンパイラと結果は同様(Cで不可・C++可)でした。CとC++での規約違いでしょうか・・・。
投稿: konuma | 2009/09/19 12:26:19