switch文内部変数の定義問題

1234 ワード

C++は、switch構造の場合、最後のcase記号またはdefault記号の後に変数を定義するしかないことを規定している.
どうしてですか.まず、次のコードを見てみましょう.
void f(int i) {
    switch (i) {
    case 1: 
        int x = 1;
        break;
    case 2:
        int y = 2;
        break;
    }
}

int main() {
    f(3);
    return 0;
}

g++でコンパイルすると、次のエラーが発生します.
  :    case    [-fpermissive]
  :   ‘int x’    

変数の役割ドメインは、通常、ブロックが終了するまで定義から有効であることが知られています.すなわち、上記のコードで定義されたxとyの役割ドメインは、caseごとのbreakではなく、switchブロックが終了するまで定義から開始される!
コンパイラのコンパイル時にswitch文が最終的にどのcaseにジャンプするかを決定することはできません.プログラムの実行時にcase 2にジャンプした場合、変数xはまだ定義されていません(ただし、xは独自の役割ドメインに存在し、case 2で使用される可能性があります).したがって、コンパイラは、プログラムの実行時に変数の定義と初期化をスキップしないように、変数の定義を条件ブロックに配置しているかどうかを常にチェックし、上記のコードのようにエラーや警告を与えます.
どのように防止しますか?簡単:
1.できるだけswitch文で変数を定義しないでください.
2.各caseで定義された変数の役割ドメインを明示的に指定します.上のコードを次のように変更します.
void f(int i) {
    switch (i) {
    case 1: 
        {
            int x = 1;
            //      x 
            // ...
        }    //        x     
        break;
    case 2:
        {
            int y = 2;
            //      y
            // ...
        }    //        y     
        break;
    }
}

int main() {
    f(3);
    return 0;
}