어디선가 받은(?) 라이브러리를 컴파일할 일이 있어서 간만에 C++ Builder를 만지게 되었다.
그런데 컴파일 도중 이상한 에러가 나왔다.
에러는 아래와 같다.
E2203 Goto bypasses initialization of a local variable
goto를 지나서 지역변수를 선언한게 있다는 말인데...
VC++에서는 잘 컴파일 되는 라이브러리란다.
흠... goto... goto...
VC++와 C++ Builder로 간단한 테스트 프로그램을 작성해보았다.
VC ++
int _tmain(int argc, _TCHAR* argv[])
{
int a = 5;
1>Compiling...
1>LocalVariable.cpp
1>Build log was saved at "LocalVariable\Debug\BuildLog.htm"
1>LocalVariable - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
{
int a = 5;
if( a == 0 )
goto exit;
int b = 5;
exit:
return 0;
}
== 컴파일 결과 ==
1>Compiling...
1>LocalVariable.cpp
1>Build log was saved at "LocalVariable\Debug\BuildLog.htm"
1>LocalVariable - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
C++ Builder
int _tmain(int argc, _TCHAR* argv[])
{
int a = 5;
if( a == 0 )
goto exit;
int b = 5;
exit:
return 0;
}
== 컴파일 결과 ==
[BCC32 Error] File1.cpp(15): E2203 Goto bypasses initialization of a local variable
[BCC32 Warning] File1.cpp(21): W8004 'b' is assigned a value that is never used
Failed
{
int a = 5;
if( a == 0 )
goto exit;
int b = 5;
exit:
return 0;
}
== 컴파일 결과 ==
[BCC32 Error] File1.cpp(15): E2203 Goto bypasses initialization of a local variable
[BCC32 Warning] File1.cpp(21): W8004 'b' is assigned a value that is never used
Failed
C++ Builder에서는 E2203 에러가 발생한다.
해결책은 간단하다.
지역변수 선언을 goto 위에서 하면 된다.
int _tmain(int argc, _TCHAR* argv[])
{
int a = 5, b;
if( a == 0 )
goto exit;
b = 5;
exit:
return 0;
}
== 컴파일 결과 ==
[BCC32 Warning] File1.cpp(21): W8004 'b' is assigned a value that is never used
Success
{
int a = 5, b;
if( a == 0 )
goto exit;
b = 5;
exit:
return 0;
}
== 컴파일 결과 ==
[BCC32 Warning] File1.cpp(21): W8004 'b' is assigned a value that is never used
Success
b를 이용한 곳이 없다는 Warning이 나오고 컴파일은 성공한다.
goto를 return과 try finally로 변경하는 삽질을 하다가 집에 와서 느긋하게 테스트해봤는데 아무래도 내일 가서 모두 바꿔야 할듯 싶다 -_-;
아 삽질하기전에 테스트 좀 해보자.
머리가 나쁘면 손발이 고생이군.
그나저나 보기에는 VC++ 방식도 별 문제는 없어 보이는데 C++ Builder에서는 왜 에러로 처리할까나?
궁금해져서 구글링을 해보았으나 별다른 답변을 찾지 못했다.
내가 작업하는 소스면 goto를 안쓰던지 주의해서 쓰면 되는데 받아온 라이브러리이니 난감하기 짝이 없다.
뭔가 옵션이 있으려나...
엠바카데로의 docwiki에는 아래와 같은 짤막한 설명만 있군...
http://docwiki.embarcadero.com/RADStudio/en/E2203_Goto_bypasses_initialization_of_a_local_variable_%28C%2B%2B%29
우선은 컴파일이 급하니 위쪽에 선언하는 걸로 해결하고 옵션이나 다른 해결방법이 있는지는 더 조사해봐야겠다.