C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 FAQ
C++Builder Programming FAQ
[21] [C++][C] 에러메시지 Case bypasses initialization of local variable
박지훈.임프 [cbuilder] 21433 읽음    2001-03-24 13:42
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;
}
원래 코딩의 의도를 가장 잘 살리면서 문제가 없는 방법으로서, 가장 권할 만한 방법이죠.

그럼 참고하시길...
빌더유저 [hanbinjjang1]   2007-11-01 20:16 X
감사합니다.

+ -

관련 글 리스트
21 [C++][C] 에러메시지 Case bypasses initialization of local variable 박지훈.임프 21433 2001/03/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.