switch文の途中で宣言する

普通に書くとswitch文の途中で変数を宣言することが出来ません。



例えば、以下の文はエラーになります。

switch( ) {

  case 1:

    int hoge; // コンパイルエラー
    /* ・・・(略) */
    break;

  default:
   // hogeのスコープはまだ有効

}  // hogeのスコープはここで終了(括弧の終わり)

変数hogeのスコープは有効にもかかわらず、caseラベルが実行されないパターンではhogeが定義されません。コンパイラはエラーとせざるを得ないのです。

どうしてもswitch文で宣言したい場合、以下のようにスコープを限定すれば良いです。

switch( ) {

  case 1:

    {

    int hoge; // コンパイル成功

    } // hogeのスコープが終了


理由を考えたら当然ですが、defaultラベルにおける宣言は普通に出来ます。

Leave a Reply

2 Comments on "switch文の途中で宣言する"

Notify of
avatar
Sort by:   newest | oldest | most voted
KatokichiSoft
Guest

上記で「defaultラベルにおける宣言は可能」とありますが、厳密には「switch文の最後に記したラベルでの宣言は可能」ですよね。
ちなみにgcc(Cコンパイラ)では最後のラベルに記しても他のラベルと同じ理由でNGで、g++(C++コンパイラ)ではコンパイル可能でした。
ご参考まで。

konuma
Guest

コメント有り難うございます。
なるほど、「defaultを最後書く」という固定観念で「本質」を見落としていたようです。
ちなみに、コメント内容をVisual Studio 2005で実験したところ、GNUコンパイラと結果は同様(Cで不可・C++可)でした。CとC++での規約違いでしょうか・・・。

wpDiscuz