컴파일 전에 코드 수준에서의 조작에 있서서도 조건부 조작이 가능하다.

#if
바로 뒤에 상수 또는 이미 정의된 문자상수가 온다. 즉, 평가시 상수인 표현이 온다.
평가값이 0 이면 다음줄 부터의 내용을 건너뛰고, 평가값이 0이 아니면 처리한다.

#ifdef
#if 와 마찬가지인데, 단지 바로 뒤에 나오는 식별자가 #define 으로 미리 정의가 되어있으면 처리 하고, 그렇지 않으면 건너뛴다.

#if defined
#if defined 에서 defined 는 뒤따라 오는 식별자가 정의되어있으면 1을, 그렇지 않으면 0 으로 평가된다.

defined 는 여러개 사용될수 있으며 논리부정도 가능하다.

#if defined(identifier) 는 #if defined identifier 와 같다.

예. #if defined(HP9000) || defined(SUN4) && !defined(VAX)

가령 VS2008 에서 math.h 를 열어보면, 수학상수 쪽 코드를 보면,
#if defined(_USE_MATH_DEFINES) 뭐 요딴게 들어있는데, 따라서, 수학상수 가령 M_PI 같은 거 쓰려면
앞부분에 #define _USE_MATH_DEFINES 하고 정의해줘야한다.


#ifndef 는 if not defined 이다. 논리부정만 빼면 #if와 같다.

이것은 다음과 같은 형태로도 자주 쓰인다.

#ifndef ABC
#define ABC 123
#endif


즉, 정의되어있지 않다면, 이렇게 정의해라 라고 명령한다.



#else , #elif
전처리기의 조건부 컴파일은, if 문의 else와 유사하게  #else 를 가지고 있고, else if 와 유사하게 #elif 를 가지고 있다. 방식도 유사하다.


#endif
조건부 컴파일의 종료를 나타낸다.


---------------------------------------------------------------------------------------

조건부 컴파일은 코드의 특정부분을 껐다가 켰다가 할 때 사용할 수도 있다.
물론, 많은경우 주석문으로 감싸버리면 특정 코드를 삭제할 수 있지만, 삭제하는 부분에 주석문이 들어가있으면 오류가 날 수도 있다.

가령, /* 와 */ 로 감쌌는데, 감싼 코드에 /* ... */ 들어있으면... 코드부분의 */ 과 반응하여 주석이 닫혀버리기 때문에 이후의 부분은 주석화 되지 않는다.

그럴때, 문제없이 통째로 주석화 시켜버리는 방법은 다음과 같이 감싸는 것이다.

#if 0
...
#endif

감싼 부분을 켰다껐다 하는 것은 #if 의 0 을 1과 바꿔가며 작업하면 된다.



이와 같이 코드의 특정부분을 컴파일 할지 말지 선택할 수 있는데, 이것을 동시에 여러부분에 적용할 수 도 있다.
가령 다음과 같이 하면 된다.

코드 앞부분에 #define DEBUG 1  과 같이 매크로를 하나 정의해놓고,

켰다 껐다 할 코드의 각 부분들을 모두 #if Take  , #endif 로 감싸버린다.
이렇게 하면 #define Take 1 의 상수를 0 또는 1 로 바꿔가면서, 코드의 여러부분을 동시에 컴파일할지 말지 결정할 수 있다.

예.
#define Take 1
...
...

#if Take
...
#endif
...
...
#if Take
...
#endif
...


여기에 하나더 응용해서 #if !(Take) 와 같이 논리부정을 사용하여 반대로 조건부 컴파일 되는 부분을 지정해주면, 상호 배타적으로 컴파일 되는 부분을 만들수도 있다. 물론, 한덩어리의 형태라면 #else를 써도 되고, 다양한 선택사양이 있다면, #elif 를 중복사용해도 된다.

#ifdef 도 마찬가지로 쓸 수 있다. 이때는 앞에 #define DEBUG 만 있으면 되고, 이 매크로를 삭제해버리면 컴파일 안되게 할 수 있다. #ifndef 하고도 잘 섞어서 쓰면 여러가지 기능을 구현할 수 있다.