#if, #elif, #else, and #endif 지시문

소스 파일의 일부 컴파일을 제어하는 전처리기 지시문입니다.

#if ifCondition ...
[#elif elifCondition ...]
[#else ...]
#endif

매개 변수

항목 설명
ifCondition
평가할 기본 조건입니다. 이 매개 변수가 0이 아닌 값으로 계산되는 경우 이 #if 지시문과 #elif, #else 또는 #endif 지시문의 다음 인스턴스 사이의 모든 텍스트가 번역 단원에 유지됩니다. 그렇지 않으면 후속 소스 코드가 유지되지 않습니다.
조건은 정의된 전처리기 연산자를 사용하여 특정 전처리기 상수 또는 매크로가 정의되었는지 여부를 확인할 수 있습니다. 이 사용량은 #ifdef 지시문을 사용하는 것과 같습니다.
ifCondition 매개 변수의 값에 대한 제한 사항은 주의 섹션을 참조하세요.
elifCondition [선택 사항]
평가할 기타 조건입니다. ifCondition 매개 변수와 모든 이전 #elif 지시문이 0으로 평가되고 이 매개 변수가 0이 아닌 값으로 계산되는 경우 이 #elif 지시문과 #elif, #else 또는 #endif 지시문의 다음 인스턴스 사이의 모든 텍스트가 번역 단위에 유지됩니다. 그렇지 않으면 후속 소스 코드가 유지되지 않습니다.
조건은 정의된 전처리기 연산자를 사용하여 특정 전처리기 상수 또는 매크로가 정의되었는지 여부를 확인할 수 있습니다. 이 사용량은 #ifdef 지시문을 사용하는 것과 같습니다.
elifCondition 매개 변수의 값에 대한 제한 사항은 주의 섹션을 참조하세요.

설명

원본 파일의 각 #if 지시문은 닫는 #endif 지시문과 일치해야 합니다. #if 지시문과 #endif 지시문 사이에는 여러 #elif 지시문이 표시될 수 있지만 #else 지시문이 하나 이상 허용됩니다. #else 지시문(있는 경우)은 #endif 전에 마지막 지시문이어야 합니다. 포함 파일에 포함된 조건부 컴파일 지시문은 동일한 조건을 충족해야 합니다.

#if, #elif, #else 및 #endif 지시문은 다른 #if 지시문의 텍스트 부분에 중첩할 수 있습니다. 중첩된 각 #else, #elif 또는 #endif 지시문은 앞의 가장 가까운 #if 지시문에 속합니다.

0이 아닌 값으로 평가되는 조건이 없으면 전처리기는 #else 지시문 뒤에 있는 텍스트 블록을 선택합니다. #else 절을 생략하고 조건이 0이 아닌 값으로 계산되지 않으면 텍스트 블록이 선택되지 않습니다.

ifConditionelifCondition 매개 변수는 다음 요구 사항을 많이 충족합니다.

  • 조건부 컴파일 식은 서명된 긴 값으로 처리되며 이러한 식은 C++의 식과 동일한 규칙을 사용하여 평가됩니다.
  • 식은 정수 계열 형식이어야 하며 정수 상수, 문자 상수 및 defined 연산자만 포함할 수 있습니다.
  • 식은 sizeof 또는 형식 캐스트 연산자를 사용할 수 없습니다.
  • 대상 개발 환경은 모든 범위의 정수를 나타내지 못할 수 있습니다.
  • 변환은 형식과 동일한 형식 나타내고 부호 없는 int부호 없는 long과 동일합니다.
  • 변환기는 문자 상수를 대상 개발 환경에 대한 집합과 다른 코드 값의 집합으로 변환할 수 있습니다. 대상 개발 환경의 속성을 확인하려면 대상 개발 환경용으로 작성된 애플리케이션의 LIMITS.H에서 매크로 값을 확인합니다.
  • 식은 환경 조회를 수행해서는 안 되며 대상 컴퓨터의 구현 정보에서 영향을 받지 않아야 합니다.

예제

이 섹션에는 조건부 컴파일 전처리기 지시문을 사용하는 방법을 보여 주는 예제가 포함되어 있습니다.

정의된 연산자 사용

다음 예제에서는 정의된 연산자의 사용을 보여줍니다. 식별자 CREDIT가 정의되면 신용 함수에 대한 호출이 컴파일됩니다. 식별자 DEBIT가 정의되면 직불 함수에 대한 호출이 컴파일됩니다. 식별자가 정의되지 않은 경우 프린터 함수에 대한 호출이 컴파일됩니다. "CREDIT" 및 "credit"는 C 및 C++의 고유 식별자입니다. 해당 사례는 서로 다르기 때문입니다.

#if defined(CREDIT)
    credit();
#elif defined(DEBIT)
    debit();
#else
    printerror();
#endif

중첩된 #if 지시문 사용

다음 예제에서는 #if 지시문을 중첩하는 방법을 보여 줍니다. 이 예제에서는 DLEVEL이라는 기호 상수가 이전에 정의되었다고 가정합니다. #elif 및 #else 지시문은 DLEVEL 값에 따라 네 가지 선택 항목 중 하나를 선택하는 데 사용됩니다. 상수 STACK은 DLEVEL의 정의에 따라 0, 100 또는 200으로 설정됩니다. DLEVEL이 5보다 크면 STACK이 정의되지 않습니다.

#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
        #define STACK   200
    #else
        #define STACK   100
    #endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    display( debugptr );
#else
    #define STACK 200
#endif

헤더 파일 포함에 사용

조건부 컴파일은 동일한 헤더 파일이 여러 번 포함되는 것을 방지하기 위해 일반적으로 사용됩니다. 클래스가 헤더 파일에 정의되는 C++에서는 조건부 컴파일 구문을 사용하여 여러 정의를 방지할 수 있습니다. 다음 예제에서는 기호 상수 EXAMPLE_H 정의되어 있는지 여부를 결정합니다. 이 경우 파일이 이미 포함되어 있으므로 다시 처리할 필요가 없습니다. 그렇지 않으면 해당 예제를 나타내도록 상수 EXAMPLE_H 정의됩니다. H가 이미 처리되었습니다.

#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

참고 항목

전처리기 지시문(DirectX HLSL)