26.4 case 안에서 변수 선언하기
switch의 case에 들어가는 코드가 길어지다 보면 변수를 선언하기도 합니다. 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 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 부분을 중괄호로 묶어주면 컴파일 에러가 발생하지 않고 변수를 선언할 수 있습니다. 단, 중괄호 안에 선언된 변수 num2는 case 1: 안에서만 사용할 수 있고 case 2:나 switch 바깥에서는 사용할 수 없습니다.