조건부 컴파일은 특정 조건에 따라 컴파일 여부를 결정한다.
// 매크로가 정의되어 있을 때 컴파일 // DEBUG 매크로가 정의되어 있을 때 컴파일
#ifdef 매크로 #ifdef DEBUG
코드 printf("Debug\n");
#endif #endif
// 매크로가 정의되어 있지 않을 때 컴파일 // DEBUG 매크로가 정의되어 있지 않을 때 컴파일
#ifndef 매크로 #ifndef DEBUG
코드 printf("Hello, world!\n");
#endif #endif
// 값 또는 식이 참일 때 컴파일 // DEBUG_LEVEL이 2 이상일 때 컴파일
#if 값 또는 식 #if DEBUG_LEVEL >= 2
코드 printf("Debug Level 2\n");
#endif #endif
// 조건이 항상 거짓이므로 컴파일 하지 않음
#if 0
printf("0\n");
#endif
// 조건이 항상 참이므로 컴파일함
#if 1
printf("1\n");
#endif
#### // 매크로가 정의되어 있을 때 컴파일.
// !, &&, ||로 논리 연산 가능 // DEBUG 또는 TEST가 정의되어 있을 때 컴파일
#if defined 매크로 #if defined DEBUG || defined TEST
코드 printf("Debug\n");
#endif #endif
// DEBUG가 정의되어 있으면서
// VERSION_10이 정의되어 있지 않을 때 컴파일
#if defined (DEBUG) && !defined (VERSION_10)
printf("Debug\n");
#endif
// if, elif, else로 조건부 컴파일 // DEBUG_LEVEL의 값에 따라 컴파일
#if 조건식 #if DEBUG_LEVEL == 1
코드 printf("Debug Level 1\n");
#elif 조건식 #elif DEBUG_LEVEL == 2
코드 printf("Debug Level 2\n");
#else #else
코드 printf("Hello, world!\n");
#endif #endif
// if, elif, else로 조건부 컴파일 // PS2, USB 정의 여부에 따라 컴파일
#ifdef 매크로 #ifdef PS2
코드 printf("PS2\n");
#elif defined 매크로 #elif defined USB
코드 printf("USB\n");
#else #else
코드 printf("지원하지 않는 장치입니다.\n");
#endif #endif
위와 같이 조건부 컴파일을 사용할 수 있다.
또한 헤더파일을 여러소스에서 사용하는 경우 컴파일 에러가 발생하는데 컴파일 과정에서 각 소스파일에서 같은 헤더파일을 정의하기 때문에 충돌이 나기 때문이다.
아래와 같이 작성하며 이 문제를 해결할 수 있다.
#ifndef 매크로A // 매크로A가 정의되어 있지 않다면 #ifndef DATA_H // DATA_H가 정의되어 있지 않다면
#define 매크로A // 매크로A 매크로 정의 #define DATA_H // DATA_H 정의
// 구조체, 공용체, 열거형 등 정의 typedef struct _DATA { // 구조체 _DATA 정의
int a;
#endif // #ifndef 매크로A 끝 int b;
} DATA;
#endif // #ifndef DATA_H 끝