미리 정의된 매크로를 사용하면 상황별로 코드를 나눠서 컴파일하기가 편라히다. 일례로 다음과 같은 경우가 있을 수 있다. 자신이 작성한 라이브러리가 디버그와 릴리즈를 별도로 제공하는 경우를 들 수 있다. 보통의 경우 라이브러리 이름 끝에 d가 붙은 것은 디버그용 라이브러리다. 그래서 system.lib를 조건에 따라서 두 종류로 배포한다고 해보자. 릴리즈는 system.lib고, 디버그는 systemd.lib가 되는 셈이다.
#ifdef \_DEBUG
#pragma comment(lib, "system.lib")
#else
#pragma comment(lib, "systemd.lib")
#endif
```여기까진 기본이다. 그런데 라이브러리를 배포하다 보면 종종 CRT 종류를 맞춰줘야 하는 상황이 생긴다. CRT가 맞지 않으면 여러가지 오류가 생기는 원인이 된다. 특히 MFC등과 같이 컴파일되는 경우에는 더욱 심해진다. 그래서 CRT 종류별로 라이브러리를 배포하게 된다. 보통의 경우 싱글 쓰레드 CRT는 쓰지 않기 때문에 그놈은 배제 하기로 한다. 그러고 나면 멀티쓰레드 CRT, 멀티쓰레드 DLL CRT이렇게 두 종류가 생긴다. 여기다 디버깅까지 포함하면 총 4종류의 라이브러리가 생성된다. 이것들을 각각 상황에 맞게 빌드하려면 아래와 같이 할 수 있다.
```cpp
#if defined(\_DEBUG) && defined(\_DLL)
// DLL 디버그
#elif defined(\_DEBUG) && !defined(\_DLL)
// 스태틱 디버그
#elif !defined(DEBUG) && defined(\_DLL)
// DLL 릴리즈
#else
// 스태틱 릴리즈
#endif
```이런데 사용되는 \_DEBUG, \_DLL등이 프리디파인드 매크로다. \_DEBUG는 디버그 빌드일 경우 정의되고, 릴리즈 빌드일 경우 정의되지 않는다(ANSI 표준은 NDEBUG다). \_DLL은 멀티쓰레드 DLL로 컴파일 되는 경우 정의되고, 그렇지 않은 경우 정의되지 않는다. 이놈들은 생각 보다 종류가 아주 다양하게 많다. 따라서 빌드되는 상황을 아주 상세하게 알 수 있다. 더 많은 프리디파인드 헤더에 대해서 알고 싶으신 분들은 아래 페이지를 참고하자!!
<http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/prepr_18.asp>