3. 조건부 컴파일(Conditional Compilation)
- 조건부 컴파일이란, 코드 일부를 특정 조건에 따라 선택적으로 컴파일하는 기능이다.
- 이는 C 언어의 선행처리기(Preprocessor) 지시문을 활용하여 구현한다.
- 프로그램 실행 중이 아니라, 컴파일 이전 단계에서 조건을 평가하고 해당 코드의 포함 여부를 결정한다.
✳️ 주로 운영체제별 코드 분기, 디버깅 구문 삽입, 기능 켜기/끄기 옵션 처리 등에 사용한다.
1) #ifdef ~ #endif
#ifdef 매크로명
// 매크로가 정의되어 있을 때 컴파일되는 영역
#else
// 정의되어 있지 않을 때 컴파일되는 영역
#endif
· #ifdef는 매크로가 정의되어 있으면 참으로 판단한다.
· #else는 선택 사항이며, 조건이 거짓일 때 실행할 코드를 포함할 수 있다.
✅ 주로 디버깅 코드 삽입이나 플랫폼 분기 처리에 사용한다.
💻 예제 코드 ①: #ifdef ~ #endif
#include <stdio.h>
#define DEBUG // DEBUG 매크로 정의
int main() {
int a = 10;
int b = 20;
int sum = a + b;
#ifdef DEBUG
// DEBUG가 정의되어 있을 때만 출력
printf("Debug: a = %d, b = %d, sum = %d\n", a, b, sum);
#else
// DEBUG가 정의되지 않았을 경우
printf("Sum is calculated.\n");
#endif
return 0;
}
🖨️ 실행 결과 (DEBUG가 정의된 상태)
Debug: a = 10, b = 20, sum = 30
2) #ifndef ~ #endif
#ifndef 매크로명
// 매크로가 정의되어 있지 않을 때 컴파일되는 영역
#else
// 매크로가 정의되어 있을 때 컴파일되는 영역
#endif
·#ifndef는 매크로가 정의되어 있지 않으면 참이다.
· 주로 헤더 중복 포함 방지(Include Guard)에 사용한다.
💻 예제 코드 ②: #ifndef ~ #endif
#include <stdio.h>
#ifndef VERSION
#define VERSION "1.0.0"
#endif
int main() {
printf("현재 버전: %s\n", VERSION);
return 0;
}
🖨️ 실행 결과
현재 버전: 1.0.0
✳️ #ifndef는 이미 정의된 경우를 피해 정의하는 용도로 자주 사용한다.
⚠️ 같은 헤더 파일이 여러 번 포함될 경우, 다중 정의 오류를 방지할 수 있다.
3) #if ~ #elif ~ #else ~ #endif
#if 조건식
// 조건식이 참일 때
#elif 다른 조건식
// 위 조건이 거짓이고 이 조건이 참일 때
#else
// 위 모든 조건이 거짓일 때
#endif
· 매크로 값(숫자)을 기반으로 다양한 분기 처리를 할 수 있다.
· #ifdef와 달리 정수 값을 비교할 수 있다는 점이 특징이다.
· 다중 조건 분기 처리가 가능하므로 환경 설정에 따라 다른 기능을 선택적으로 포함할 수 있다.
💻 예제 코드 ③: #if ~ #elif ~ #else ~ #endif
#include <stdio.h>
#define LEVEL 2 // LEVEL 매크로 정의
int main() {
#if LEVEL == 1
printf("레벨 1: 초급자용 기능입니다.\n");
#elif LEVEL == 2
printf("레벨 2: 중급자용 기능입니다.\n");
#else
printf("레벨 3: 고급자용 기능입니다.\n");
#endif
return 0;
}
🖨️ 실행 결과
레벨 2: 중급자용 기능입니다.
✅ 조건식에는 산술 연산자, 비교 연산자 사용 가능
❗ 문자열 비교는 사용할 수 없다. 오직 정수 표현식만 허용한다.
✅ 마무리 정리
1️⃣ 조건부 컴파일은 특정 조건에 따라 코드의 포함 여부를 결정하는 기능이다.
2️⃣ #ifdef는 매크로가 정의되어 있을 경우에만 코드를 포함한다.
3️⃣ #ifndef는 매크로가 정의되어 있지 않을 경우에만 코드를 포함한다.
4️⃣ #if는 정수 조건식을 평가하여 분기 처리를 수행한다.
5️⃣ 헤더 중복 포함을 방지할 때는 #ifndef ~ #define ~ #endif 패턴을 사용한다.
6️⃣ 조건부 컴파일은 코드 유지보수, 디버깅, 환경 분기 처리에 필수적이다.
'Language > C' 카테고리의 다른 글
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 헤더 파일 분리와 다중 소스 파일 관리 (1) | 2025.06.24 |
|---|---|
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - Include Guard (0) | 2025.06.24 |
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 매크로 (0) | 2025.06.24 |
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 선행처리기 (0) | 2025.06.24 |
| 📌 Chapter 16 - 동적 메모리와 연결 리스트 - 연결 리스트 (0) | 2025.06.23 |