지난번 조환규 교수님께서 마소 -- 마이크로소프트웨어 -- 에 기고한 내용을 보면 조건부 컴파일이 디버깅 내공의 거의 최종 단계로 소개된 적이 있다. 오늘은 그 조건부 컴파일에 대해서 알아보도록 하자!!!
사실 조건부 컴파일은 별로 쓸모없어 보이지만 조금만 익숙해지면... 밥먹듯이 쓰는것이 이것이며,... 자제를 요하는 부분도 이 부분이다. 조금만 배워보면 알겠지만, 이 조건부 컴파일은 소스의 가독성을 떨어뜨리고 읽기 힘들게 만들뿐만 아니라, C언어의 각종 방언을 만들어내는 공범이기도 하다...
아래는 조건부 컴파일에 사용되는 전처리기 이다.
#if -- 뒤쪽의 조건이 참인 경우 컴파일 한다.
#endif -- 해당 if블록의 끝을 나타낸다.
#else -- 위의 if절이 거짓인 경우 컴파일 한다.
#elif -- 위의 if절이 거짓이고 해당 elif다음 조건이 참인 경우
컴파일한다.
#ifdef -- 뒤쪽 상수가 정의 되어져 있으면 컴파일한다.
#ifndef -- 뒤쪽 상수가 정의 되어 있지 않으면 컴파일한다. 실제로 너무나 간단하다..^^ ㅋㅋ... 그럼 실제 사용예를 한번 살펴보도록 하자...
#if 0
소스 들...
#endif 위의 코드에서 소스들은 컴파일 되지 않는다. 왜냐하면 #if 다음 절이 0으로 거짓이기 때문이다. 따라서 특정 부분을 임시적으로 제외시킬때 주석보다는 조건부 컴파일을 사용하는 편이 더 편리하다.
#if VER > 10
소스1
#elif VER > 5
소스2
#else
소스3
#endif 위의 코드의 경우는 VER이 10보다 크면 소스1이 컴파일 되고, 5보다 크면 소스 2가, 그 외의 경우는 소스3이 컴파일 된다. 실제로 위와 같은 경우는 특정 라이브러리 내지는 시스템 버전에따라서 함수나 구조체가 틀릴경우에 많이 사용되어지는 코드이다.
#ifndef XXX_H
#define XXX_H
소스
#endif 설명이 필요없는 전처리기 예제이다. 헤더파일의 중첩 포함을 막는 전처리기 구문이다. XXX_H가 선언되어져 있지 않다면 소스 부분이 컴파일 된다. 이 때... #ifndef다음 줄을 보면 알게 되겠지만, 바로 XXX_H를 정의해 버린다. 이렇게하면 한번 포함되어진 소스가 두번이상은 절대로 포함되지 않기 때문이다. 왜냐하면 다음번에는 XXX_H가 정의되어져 있으므로 해당 블록이 컴파일 되지 않기 때문이다. 말로하면 조금 어려운것 같지만... 실제로 곰곰 생각해보면 별것 아닌넘이다..
이상 조건부 컴파일에 관한 간략한 설명이었다. 실제로 조건부 컴파일은 여러가지 편리함과 동시에 강력한 기능들을 제공하지만, 마구 난무할 경우에는 소스의 가독성이 떨어지고, 버전 관리가 힘들어진다는 단점이 있다. 아무리 좋은것이라도 적당히 쓰는 습관을 들이는 것이 좋다... 그럼...^^