다음을 통해 공유


#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 지시문과 일치해야 합니다. #elif 지시어는 #if 및 #endif 지시어 사이에 얼마든지 나타날 수 있지만 #else 지시어는 최대 하나만 허용됩니다. #else 지시문이 있는 경우 #endif 이전의 마지막 지시문이어야 합니다. 포함 파일에 포함된 조건부 컴파일 지시문은 동일한 조건을 충족해야 합니다.

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

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

ifConditionelifCondition 매개 변수는 다음 요구 사항을 대부분 충족합니다.

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

예제

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

정의된 연산자 사용

다음 예에서는 정의된 연산자의 사용을 보여 줍니다. 식별자 CREDIT가 정의된 경우 credit 함수에 대한 호출이 컴파일됩니다. 식별자 DEBIT가 정의된 경우 debit 함수에 대한 호출이 컴파일됩니다. 식별자가 정의되지 않은 경우 printerror 함수에 대한 호출이 컴파일됩니다. "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는 EXAMPLE.H가 이미 처리되었음을 나타내도록 정의됩니다.

#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

추가 정보

전처리기 지시문(DirectX HLSL)