C로 코딩할 때 swith 문을 많이 사용한다.그리고 지금까지 별 문제없이, 아니 아무 생각없이 썼다.

근데.. 문제가 생겼다. 일반적으로 swtich 문에서 case 구절에서 중괄호를 쓰지 않는다. 그리고 아래 코드 역시 중괄호 없이 그냥 코딩 했다.

switch(shapeChoice){
        case 1 :
            Line * l = new Line();
            v.push_back(l);
            break;
        case 2 :
            Circle * c = new Circle;
            v.push_back(c);
            break;
        case 3 :
            Rect * r = new Rect;
            v.push_back(r);
            break;
        default :
            break;
    }

굉장히 평범해보인다. 무척 자연스럽다. 하지만 컴파일이 안된다. 아무리 해도 안되고, 왜 안되는지 도저히 알 수가 없었다.

 

main.cpp:40:14: error: jump to case label
   40 |         case 3 :
      |              ^
main.cpp:33:20: note:   crosses initialization of 'Line* pLine'
   33 |             Line * pLine = new Line;
      |                    ^~~~~
main.cpp:44:9: error: jump to case label
   44 |         default :
      |         ^~~~~~~
main.cpp:33:20: note:   crosses initialization of 'Line* pLine'
   33 |             Line * pLine = new Line;
      |                    ^~~~~

 

인터넷에 찾아보니.. case 문 안에서 변수나 클래스를 선언할 경우, 중괄호를 사용해야한다. 예를 들면 이런거다.

switch(tmp)
{
	case 1:
		int a;
		a = 1;
		break;
	case 2:
		a = 4;
		break;
}

코드에서 보면 case 1: 에서 int가 선언되었고, 중괄호를 없어서 하나의 스코프로 컴파일러는 인식할 수 있다. 하지만 case 구역은 분리되어 있어 엄연히 다른 구역이다. 때문에 case 2: 로 바로 가면 오류가 발생할 수 있다. 아무래도 컴파일러는 이를 미연에 방지하고자 case 문 안에서는 반드시 중괄호를 치도록 하는 것 같다.

 

중괄호를 사용 후 잘 된다.

'C++' 카테고리의 다른 글

c++에서 vector에 접근하는 4가지 방법  (0) 2024.01.21
inline function defined in source file? or header file?  (0) 2024.01.20
try-throw-catch  (1) 2024.01.20
while(cin >> x)  (0) 2024.01.20
down up casting  (0) 2022.06.08

+ Recent posts