안녕하세요. 천리안 프로그래머포럼 C++Builder 담당자 임펠리테리입니다.
빌더 1에서 작성된 프로젝트 소스를 빌더 3에서 컴파일할 때 가장 문제가 되는 부분
은 write에 사용된 프로퍼티의 리턴값을 read 할수 없다는 경우입니다.
구체적인 예를 들어보죠.
빌더의 빈폼에 버튼 하나를 놓고 그 클릭 이벤트 핸들러를 다음과 같이 작성했다고
가정해봅시다.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Caption = Caption = "11";
}
이 문장은 Ansi C++문법에 적법해 보이고, 아무런 문제도 없어보이지만 실제로 컴파
일을 해보면 다음과 같은 컴파일 에러메시지가 뜨게 됩니다.
Cannot use the result of property assignment as an rvalue.
빌더1에서 별다른 문제없이 컴파일되었던 소스가 이와 같은 에러를 낼수밖에 없는
근본적인 원인은, 보통 프로퍼티를 그냥 변수처럼 사용하고 있지만 사실은 read와
write로 나누어진 두 함수의 결합이기 때문입니다. 위 문장을 read와 write함수의
역할로 다시 생각해보면, "11"이란 문자열을 폼의 Caption 프로퍼티의 wrtie함수에서
받고 있습니다. 그리고 그 리턴값을 다시 Button1의 Caption 프로퍼티에 할당하고 있
는 거죠. 그런데, 일반적으로는 어떤 프로퍼티의 write메소드의 리턴값은 read메소드
의 리턴값과 같지만, 특수한 에러코드의 처리등과 같이 그렇지 않은 경우도 있습니다.
그래서 프로퍼티의 write 메소드의 리턴값을 그대로 read 메소드의 리턴값으로 간주
할 수 없도록 빌더3에서 아예 막아버린거죠.
위와 같은 문제가 생겼을때 해결은 간단합니다. 두 문장으로 나누어버리면 되는거죠.
Caption = "11";
Button1->Caption = Caption;
이외에도 빌더1으로 작성된 소스를 빌더3에서 컴파일할 때 생기는 문제는 몇가지가
더 있었던 것 같지만, 그렇게 크게 문제가 되었던 것 같지는 않습니다. 참, 빌더3에
서는 패키지 개념이 도입되어 프로젝트 옵션에서 패키지를 포함시키지 않고 컴파일했
을 경우 배포시에 패키지 화일들이 없으면 실행이 안되는 문제도 있겠죠. 이에 대해
서는 아래 글들중에 자세한 답변이 있으니 찾아보시기 바랍니다.
도움되시길 바라면서, 그럼 이만...
독립문에서 임펠리테리였습니다.
(cbuilder, skyhi18)
|