switch文のcaseでのブロック

switch文のcaseの中で変数宣言する場合は注意が必要です。

#include <iostream>
using std::cout; using std::endl;

int main () {
    switch(1) {
        case 1:
            int i = 0;
            break;
        case 2:
            int i = 0;
            break;
    }
    return 0;
}
$ cl /W4 /EHsc main.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main.cpp(9) : error C2360: 'i' の初期化が 'case' ラベルによって行われませんでした。
        main.cpp(7) : 'i' の宣言を確認してください。
main.cpp(10) : error C2374: 'i' : 再定義されています。2 回以上初期化されています。
        main.cpp(7) : 'i' の宣言を確認してください。

このように、各caseの中でint iを宣言した場合、同じ宣言だと認識されてしまいます。

switch文はcase内ではなくswitch全体でひとつのスコープだとみなされるようです。

こういった単純ミスを防ぐための良くやる書き方としてcaseにブロックを追加すると良いようです。

#include <iostream>
using std::cout; using std::endl;

int main () {
    switch(1) {
        case 1: {
            int i = 0;
            break;
        }
        case 2: {
            int i = 0;
            break;
        }
    }
    return 0;
}

これは別段特殊な構文とかではなく単にブロックで囲ってるだけなんですが、見た目がスッキリするので良いなと思いました。