nassol 님이 쓰신 글 :
: 관련있는지 잘 모르겠지만,
: 저두 switch ...case문에서 포인터를 선언하고 메모리 할당했을 때,
: 저런 에러를 본 거 같거든요.
: 그 때 case문을 break;까지 블럭으로 싸줬더니 에러가 안나던데,,
: 로컬 변수 초기화 제한에 대해서 좀 갈쳐주세요. 원래 제한을 두고 있는 건가요?
: 그리고 해결을 하려면 어떻게 해야 하나요?
:
: 박지훈.임프 님이 쓰신 글 :
: : 초보 님이 쓰신 글 :
: : : case bypasses initialization of a local variable
: : :
: : : 이라는 에러가 나는데요. 도무지 무슨 에러인지 모르겠네요.
: : :
: :
: :
: : 임펠리테리입니다.
: :
: : switch...case문 내에서는 일반적으로 로컬 변수의 초기화가 제한되어 있습니다. 좀더 자세한 내용을 알고 싶으시다면 switch...case문 전체를 보여주시면 알려드리지요.
: :
: : 그럼 참고하시길...
임펠리테리입니다.
소스를 보여달라고 말씀드렸는데.. ---;;
예를 들어, 다음과 같은 코드가 있다고 합시다.
switch(조건변수)
{
case 1:
int i=0;
...
break;
case 2:
...
break;
}
이와 같은 경우에, 조건변수값이 만약 2인 경우라면 case 1에서 선언하는 int i=0; 라인을 그냥 지나치게 됩니다. 그런데 C++에서 모든 변수는 블럭 내에서 선언되고 스코프를 가지게 되므로, 이 i 변수의 스코프는 switch 문 전체가 되는데, 조건에 의해 case 1 블럭을 지나치게 되므로 변수를 초기화할 수 없게 됩니다. 이 문제는 근본적으로 case 문이 goto 문의 성격을 가지고 있어 점프를 해버리기 때문에 발생하는 것입니다.
이와 같은 경우 세가지 해결책이 있을 수 있습니다.
첫번째는, 변수를 아예 switch {} 문 바깥에서 선언하고 초기화하는 것입니다. 가장 간단한 방법이지요.
두번째는 switch 문의 블럭 바로 안쪽에 선언하는 것입니다. 다음과 같이 말이죠.
switch(조건변수)
{
int i=0;
case 1:
...
break;
case 2:
...
break;
}
좀 생소한 코딩 방법이지만, 문법상으로 하자가 없으며, 실행해도 정상적으로 동작합니다.
세번째는 case문 안에서 선언하되 블럭을 설정하는 것입니다.
switch(조건변수)
{
case 1:
{
int i=0;
...
}
break;
case 2:
...
break;
}
원래 코딩의 의도를 가장 잘 살리면서 문제가 없는 방법으로서, 가장 권할 만한 방법이죠.
그럼 참고하시길...
|