Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ switch 문에서 변수 선언이 제한되는 이유와 올바른 사용법

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로 점프하더라도 안전합니다.