우리가 흔히 VCL소스를 볼때나 프로젝트 코드 사이에 있는 {$XXXXX } 컴파일러 지시자(Compiler directive)를 볼수 있는데요.
흔히 우리가 쓸수 있는 것중에 하나가 $IFDEF 지시자가 있습니다.
대표적으로 사용할 수 있는 상황은 우리가 테스트를 위한 코드가 프로그램에 삽인될 수 있습니다. 소위 디버깅시에 사용하기 유용한데요. 이런 코드는 실제 배포용에는 필요가 없지요.
이럴때 쓸만한 기능으로 {$IFDEF DEBUG} 라는 것이 있습니다.
예를 들자면 이런경우인데요.
Main.exe가 있고 Update.exe가 있습니다. 우리가 Main 프로그램을 실행하면 그전에 업데이트 프로그램을 실행하여 업데이트를 체크해준뒤 Main을 다시 실행해야합니다.
저 같은 경우는 이럴때 약간의 꼼수를 부리는데요.
예를 들자면 이런 경우입니다.
Main.exe True로 실행되는 경우 업데이트과정을 거쳤다고 판단하여 업데이트 프로그램을 실행하지 않고 Main 프로그램을 실행하고
Main.exe 뒤의 값이 없거나 false일 경우 는 Update.exe를 실행하고 자기자신은 죽어버리는 겁니다.
그럼 update.exe가 업데이트할 것이 있으면 업데이트를 하고, Main.exe를 실행하돼. true라고 실행 파라메터를 넘겨서 실행하는 것이죠. (이방식의 단점은 커맨드라인에서 main.exe true로 실행하면 업데이트 프로그램을 실행하지 않고 그냥 프로그램이 실행되는 단점을 가지기도 합니다.)
이런 시나리오의 경우 우리가 디버깅을 할때 Run메뉴에 parameter를 지정해주지 않으면 프로그램이 실행되다 뒤에 첨자가 없어서 업데이트를 수행하고 자기 자신은 죽어버립니다.
Parameter에 값을 강제로 True라고 지정해서 update 수행을 막어버릴 수도 있는데 이럴 경우 without debug 모드로 돌릴 경우는 다시 그 로직이 타지요.
이럴때 $IFDEF를 쓰시면 편하게 쓰실 수 있다는겁니다. 반대되는 지시자가 $IFNDEF 입니다.
{$IFNDEF DEBUG}
//코드부분
파라메터 체크해서 업데이트 수행
{$ENDIF}
이렇게 할 경우 디버그 모드일 때는 코드부분이 수행되지 않습니다. 단, 이것은 어떻게 컴파일을 하냐에 따라 틀립니다.
그냥 델파이에서 run을 한다고 무조건 디버그 모드로 판단하는 것이 아니라.
Build Configuration에서 Release인지 debug인지 선택을 하신후 컴파일 하시고 실행해야 저 루틴이 적용을 받습니다.
즉, debug 모드로 컴파일 하시면 해당코드는 컴파일에서 빠지겠지요. 하지만 release모드로 컴파일 할겨우는 해당코드가 삽입됩니다.
이렇게 이용하여 자신의 클래스가 운영체제 혹은 델파이 버전에 의존적일 경우 버전에 맞게 컴파일을 할 수 있도록 할 수 있습니다.
단 많은 사용은 권장하지 않습니다. 코드가 엉망이 될 가능성이 농후합니다. 고로 아주아주 적절히 아껴서 사용하시게 되면 편리하게 사용이 가능하다고 생각되네요.