switch-case 문 내에서의 local variable 선언 문제



다음과 같은 코드가 있다고 가정 해 보자


void printVal(int val)
{
    printf("value : %d", val);
}

int main(void)
{
  int val = 0;
  switch(val) {
  case 0:
      int newVal = 10;
      printVal(newVal);
      break;
  case 1:
      pritVal(val);
      break;
  }

  return 0;
}

이 코드는 다음과 같은 에러 메시지를 발생시킬 것이다

initialization of 'newVal' is skipped by 'case' label

그렇다면 이러한 에러 메시지가 발생하는 이유를 살펴보자

  • C 문제점:

    • case문을 만나게되면 이에 해당하는 Label로 jump하게 됨.
    • 하지만 int newVal = 10; 이 부분은 statement가 아니어서 jump 하고자 하는 Label이 될 수 없음
    • case 0 이후의 문장들을 { ... }로 묶어주게 되면 이는 compound statement로 인지되어 jump 가능한 Label이 됨
  • C++문제점

    • C++에서는 variable들은 initialization이 우선 수행되어야 한다.
    • case 1을 만나게 되는 상태에서의 scope에는 newVal이 존재하고 이는 case 0에서 initialization 되므로 현재 initialization이 되어있지 않은 상태이다.
    • 각 case 문들을 { ... }로 묶어주게되면 각각의 scope를 분리시키게 되므로 uninitialization 문제가 발생되지 않는다.

참조: https://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement

'개발언어 > C++' 카테고리의 다른 글

문자열 리터럴: char* vs char []  (0) 2020.08.25
String class 멤버함수 c_str()에서의 주의점  (0) 2020.08.10
decltype(auto) vs auto  (0) 2020.08.04

+ Recent posts