25.4. case 안에서 변수 선언하기

switchcase에 들어가는 코드가 길어지다 보면 변수를 선언하기도 합니다. case에서 변수를 선언하려면 어떻게 해야 할까요? 먼저 다음 내용을 소스 코드 편집 창에 입력하세요.

switch_variable_in_case_error.c

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    int num1;

    scanf("%d", &num1);    // 값을 입력받음

    switch (num1)    // num1의 값에 따라 분기
    {
    case 1:
        int num2 = num1;    // 컴파일 에러 발생
        printf("%d입니다.\n", num2);
        break;
    case 2:
        printf("2입니다.\n");
        break;
    default:
        printf("default\n");
        break;
    }

    return 0;
}

Visual Studio 2017이나 Visual Studio 2015에서는 정상적으로 되지만 Visual Studio 2013이하 버전이나 GCC에서는 컴파일 에러가 발생합니다. 왜냐하면 case 부분을 중괄호로 묶어주지 않았기 때문입니다.

Visual Studio 2013 이하

switch_variable_in_case_error.c(13): error C2143: 구문 오류 : ';'이(가) '형식' 앞에 없습니다.

GCC

switch_variable_in_case_error..c:12:9: error: a label can only be part of a statement and a declaration is not a statement

case에서 변수를 선언하려면 다음과 같이 { } (중괄호)로 묶어주면 됩니다.

switch_variable_in_case.c

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    int num1;

    scanf("%d", &num1);    // 값을 입력받음

    switch (num1)    // num1의 값에 따라 분기
    {
    case 1:
    {   // case에서 변수를 선언하려면 중괄호로 묶어줌
        int num2 = num1;
        printf("%d입니다.\n", num2);
        break;
    }
    case 2:
        printf("2입니다.\n");
        break;
    default:
        printf("default\n");
        break;
    }

    return 0;
}

소스를 컴파일하여 실행한 뒤 1을 입력하고 엔터 키를 누르세요.

실행 결과

1 (입력)
1입니다.

이처럼 case 부분을 중괄호로 묶어주면 컴파일 에러가 발생하지 않고 변수를 선언할 수 있습니다. 단, 중괄호 안에 선언된 변수 num2case 1: 안에서만 사용할 수 있고 case 2:switch 바깥에서는 사용할 수 없습니다.