본문 바로가기

old drawer/C, C++, MFC

[C/C++] #ifdef, #ifndef 전처리기 사용법

전처리기에 대한 간단한 예를 들자면요.

윈도우를 보면 홈에디션, 프로페셔널 등등 각종 버젼이 있지요?
마이크로소프트에서 윈도우 버전을 만들때 홈에디션 따로, 프로페셔널 따로 만들까요?
그렇지는 않겠지요?

이와 마찬가지로 님이 만약에 인터넷에서 파일을 다운받는 프로그램을 만들었습니다.
여기에 속도제한을 두고 싶어요.
무료로 배포할때는 최고 속도를 10으로 돈주고 사는 사람에게는 최고 속도를 100으로 하고 싶습니다.

#ifdef PRO_VER
#define MAX_SPEED 100
#else
#define MAX_SPEED 10
#endif

이렇게 해두고 제어코드는 다음과 같이 하면 되겠지요?
if( speed > MAX_SPEED )
speed = MAX_SPEED; // 최고속도를 초과하면 강제적으로 최고속도로 되돌림.

자.. 이렇게 작성을 마친후에...

유료버전을 만들기 위해 컴파일러 옵션에서 PRO_VER를 참으로 지정을 해서 컴파일을 합니다.
#ifdef PRO_VER
#define MAX_SPEED 100 <- 여기에 해당되어 컴파일
#else
#define MAX_SPEED 10
#endif
그럼 이 실행파일은 최고속도로 100을 갖게 됩니다.

무료버전을 만들기 위해 PRO_VER를 거짓으로 해서 컴파일을 합니다.
#ifdef PRO_VER
#define MAX_SPEED 100
#else
#define MAX_SPEED 10 <- 여기에 해당되어 컴파일
#endif

자~ 불필요하게 소스코드를 수정하지 않고, 컴파일러 옵션 설정만으로도 유료, 무료버전을 별도로 만들었습니다. 편리하죠?


이밖에 어떤 프로그램을 윈도우 버전, 리눅스 버전을 따로 만들어 배포하고 있습니다.
근데 C코드이기 때문에 대부분이 중복되고, 극히 일부분만 다르기 때문에 코드를 따로 관리하기가 힘듭니다.
그럼 어떻게 하면 되죠?

#ifdef WINDOWS
// 윈도우일때 필요한 코드
#else
// 리눅스일때 필요한 코드
#endif

동일한 코드는 그냥 놔두고, 극히 일부분만 다른 코드만 이런식으로 처리를 해줍니다.
그럼 컴파일할때 역시 코드 수정없이 윈도우버젼, 리눅스버젼 프로그램을 따로 만들 수 있는 겁니다.

뭐.. 이밖에도 통신환경을 설정한다거나 윈도우 버전별로 다른 처리를 하는 등등..
온갖 처리에 전처리기를 사용하게 됩니다.

다른 예를 한번 들어볼까요?

 

다음 코드로 설명을 하죠. 앞의 숫자는 쉽게 이해하기 위해 임시로 적어 놓은 라인 번호입니다.
_______________________________
01:#define _DEBUG
02:
03:func()
04:{
05: #ifdef _DEBUG
06: printf("디버그 모드\n");
07: #endif
08:
09: #ifndef _DEBUG
10: printf("일반 모드\n");
11: #endif
12:}
--------------------------------

#ifdef _DEBUG는 _DEBUG가 #define문으로 정의 되어 있다면 아래라인 부터
#endif전 라인까지 포함시키라는 전처리 지시어입니다.

그리고 #ifndef _DEBUG는 _DEBUG가 #define문으로 정의 되어 있지 않다면 아래라인 부터 #endif전 라인까지 포함시키라는 전처리 지시어입니다.

첫번째 라인에서 #define _DEBUG "_DEBUG"를 정의해 주었으므로
#ifdef _DEBUG ~ #endif사이는 포함이 될것이고 #ifndef _DEBUG ~ #endif사이는
포함이 안 될것입니다.
아래는 전처리기로 처리된 소스입니다.

_______________________________
02:
03:func()
04:{
06: printf("디버그 모드\n");
08:
12:}
--------------------------------

이정도면 충분히 이해하실거라 생각합니다. =)
참고로 _DEBUG는 실제로 Visual C에서 디버그 모드에서 기본으로 포함시키는 이름으로 디버그 모드에서만 실행시키고 쉽은 디버그 전용 코드를 #ifdef _DEBUG ~ #endif로 감싸서 사용합니다.