Language/C

📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 조건부 컴파일

e-cko 2025. 6. 24. 14:45
반응형
반응형

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️
조건부 컴파일은 코드 유지보수, 디버깅, 환경 분기 처리에 필수적이다.

반응형