❓ switch-case문의 각 case블록을 { }으로 감싸는 것은 선택 사항이었던 게 아니었나?
📌 1) 에러 발생
아래 2번째 줄에서 나타난 note: jump bypasses variable initialization
참고: 점프는 변수 초기화를 우회합니다.
아래 5번째 줄에서 나타난 error: cannot jump from switch statement to this case label
오류: switch 문에서 이 케이스 라벨로 이동할 수 없습니다.
case 3:
vector<int> v;
// 생략
case 4:
// 생략
📌 2) 에러 해결
해결 방법은 매우 간단하다!
아래처럼 case문을 { } 블록으로 감싸면 해결이 된다.
case 3: {
vector<int> v;
// 생략
}
case 4:
// 생략
📌 3) 에러 분석
찾아보니,
C++에서 switch-case문 내의 case 블록을 감싸는 것은 선택 사항이 맞다.
하지만, 특정 상황에서는 컴파일 에러가 발생할 수 있다.
왜냐하면, switch-case 문은 하나의 블록으로 간주되기 때문에, 각 case 블록 내에서 선언된 변수는 전체 switch 블록 내에서 유효하다.
따라서, 아래 코드처럼 같은 이름의 변수를 여러 case 블록 내에서 선언하려고 하면, 변수의 중복 선언으로 인해 컴파일 에러가 발생할 것이다.
switch (value) {
case 1:
int x = 10; // 변수 x 선언
break;
case 2:
int x = 20; // ❗ 오류: 변수 x가 이미 선언됨
break;
}
case 1: 과 case 2: 는 다른 블록처럼 보이지만, 사실은 같은 블록 내에서 변수를 선언한 셈이다.
그리고 case 블록 내에서 변수를 선언하고 초기화할 때, { }로 감싸지 않으면 변수의 초기화 순서나 범위 문제로 인해 에러가 발생할 수 있다.
결국, 코드의 안전성과 명확성을 위해 { }를 사용하는 것이 좋은 습관이라고 할 수 있다.
☁ switch - case 문을 사용할 때 각 case블록을 { }로 감싸는 습관을 가지자.
참고
https://www.reddit.com/r/cpp_questions/comments/a0c6tp/error_jump_to_case_label/
'💻 Programming > C++' 카테고리의 다른 글
[Visual Studio Code] VS Code C++ 개발 환경 설정 (MinGW) (0) | 2024.07.27 |
---|---|
[C++] STL(Standard Template Library) 정리 (0) | 2024.07.04 |
[C++] STL vector 사용법 (0) | 2024.07.03 |