C/C++의 switch 문에서도 변수를 선언할 수 있습니다. 다만, 변수를 선언하려면 반드시 새로운 스코프(scope), 즉 중괄호 {}로 묶인 블록 내부에서 선언하고 사용해야 합니다.
예제 코드
#include<iostream>
using namespace std;
int main() {
int i = 10;
switch(i) {
case 2:
// some code
break;
case 10: {
int x = 13; // 블록 스코프 내에서 변수 선언
cout << x;
}
}
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.
13
변수 선언 시 주의해야 할 이유
그렇다면 왜 case 라벨 바로 아래에 변수를 자유롭게 선언할 수 없을까요? 그 이유는 case 라벨로의 점프(jump)가 goto 문과 동일하게 동작하기 때문입니다.
컴파일러 입장에서는 실행 흐름이 특정 case로 건너뛰는 것이 곧 지역 변수의 선언부를 건너뛰는 것을 의미할 수 있습니다. 만약 같은 스코프 안에서 변수가 선언되기 전에 점프하여 해당 변수를 나중에 사용한다면, 초기화되지 않은 변수에 접근하는 위험한 상황이 발생할 수 있습니다.
따라서 C++ 표준에서는 동일한 스코프 내에서 지역 변수의 선언을 건너뛰어 점프하는 것을 금지하고 있으며, 이 규칙 위반 시 컴파일 에러가 발생합니다.
해결 방법
이 문제를 피하는 가장 간단한 방법은 위 예제처럼 변수를 사용하는 case 블록을 중괄호 {}로 감싸 별도의 스코프를 만드는 것입니다. 블록 스코프 안에서 선언된 변수는 해당 블록이 끝나면 소멸하므로, 다른 case로 점프하더라도 안전합니다.