76.1 조건부 컴파일 사용하기

조건부 컴파일은 #ifdef#endif 지시자를 사용하여 정의합니다. #ifdef에 매크로를 지정하면 해당 매크로가 정의되어 있을 때만 코드를 컴파일합니다.

#ifdef 매크로
코드
#endif

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

conditional_compile.c

#include <stdio.h>

#define DEBUG    // DEBUG 매크로 정의

int main()
{
#ifdef DEBUG     // DEBUG 매크로가 정의되어 있다면 #ifdef, #endif 사이의 코드를 컴파일
    printf("Debug: %s %s %s %d\n", __DATE__, __TIME__, __FILE__, __LINE__);
#endif

    return 0;
}

실행 결과

Debug: Oct  6 2015 23:30:18 c:\project\hello\conditional_compile\conditional_compile.c 8

먼저 #define으로 DEBUG라는 매크로를 정의합니다(조건부 컴파일에 사용할 매크로는 매크로 이름만 정의해도 됩니다). 그리고 다음과 같이 조건부 컴파일을 할 코드를 #ifdef, #endif로 묶어줍니다. 여기서 #ifdef DEBUGDEBUG 매크로가 정의되어 있다면 #ifdef, #endif 사이의 코드를 컴파일 합니다.

#ifdef DEBUG     // DEBUG 매크로가 정의되어 있다면 #ifdef, #endif 사이의 코드를 컴파일
    printf("Debug: %s %s %s %d\n", __DATE__, __TIME__, __FILE__, __LINE__);
#endif

printf안에서 사용한 __DATE__, __TIME__, __FILE__, __LINE__는 컴파일러에서 제공하는 매크로이며 디버그 코드를 작성할 때 유용합니다.

  • __DATE__: 컴파일한 날짜(실행 시점의 현재 날짜가 아님)
  • __TIME__: 컴파일한 시간(실행 시점의 현재 시간이 아님)
  • __FILE__: __FILE__ 매크로가 사용된 헤더, 소스 파일
  • __LINE__: __LINE__ 매크로가 사용된 줄 번호

#ifdef, #endif가 전처리기 과정을 거치면 코드는 다음과 같이 바뀝니다.

그림 76‑1 #ifdef 조건부 컴파일