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 |