C言語の構文のswitch-caseは結構変わった仕組みになってる

caseはラベルとして表現されている

identifier : statement
case constant-expression : statement
default : statement

caseの後に続くものはstatementになっている。なので、以下のコードは規格では許容されない int bb = 2は宣言であって文ではないので。

int main() {
  int a = 1;
  switch(a) {
    case 1: int bb = 2;
    break;
    case 2: a = 3;
    break;
    default: a = 4;
  }
}

gccは許容するが、規格には無いので--pedanticをつけると警告を出す

$ gcc tmp.c --pedantic
tmp.c: In function ‘main’:
tmp.c:5:13: warning: a label can only be part of a statement and a declaration is not a statement [-Wpedantic]
    5 |     case 1: int bb = 2;
      |             ^~~

switchは次のような構文になっている

switch ( expression ) statement

普段書くようなswitch-caseは、このstatementとしてにcaseやdefaultが含まれたブロックが用いられている。