# if, # elif, else, # 및 # endif 지시문 (C/C++)
#if 지시문에 #elif, #else, 및 #endif 지시문을 컨트롤 컴파일 소스 파일의 일부입니다.식을 작성 하는 경우 (후의 #if) 0이 아닌 값의 바로 다음 행 그룹의 #if 지시문 번역 단위에서 유지 됩니다.
문법
조건부 :
if 부분 elif 부품선택else 부분은수신 동의endif 선일부 경우에 :
if 줄 텍스트if 줄 :
# if 상수 식# ifdef 식별자
#ifndef 식별자
elif 부품 :
elif 줄 텍스트elif 부품 elif 줄 텍스트
elif 줄 :
# elif 상수 식else 부분은 :
else 줄 텍스트다른 선 :
#elseendif 줄 :
#endif
각 #if 지시문은 소스 파일에 닫는 일치 해야 합니다 #endif 지시문입니다.다양 한 #elif 지시문 사이의 나타날 수 있는 #if 및 #endif 지시문을 있지만 최대 하나의 #else 지시어를 허용 하는.#else 지시문에 있는 경우 있어야 전에 마지막 지시문 #endif.
#if, #elif, #else, 및 #endif 지시문의 텍스트 부분에 중첩 될 수 있습니다 #if 지시문입니다.각 중첩 된 #else, #elif, 또는 #endif 지시문에 속한 가장 가까운 앞에 #if 지시문입니다.
모든 조건부 컴파일 지시문을 같이 #if 및 # ifdef, 닫는와 일치 해야 #endif 지시문 전에 파일의 끝입니다. 그렇지 않으면 오류 메시지가 생성 됩니다.조건부 컴파일 지시문 포함 파일에 포함 되어 있는 동일한 조건을 충족 해야 합니다: 없음 일치 하지 않는 조건부 컴파일 지시문의 포함 파일의 끝에 있어야 합니다.
매크로 대체는 뒤에 오는 명령줄 부분은 내에서 수행 됩니다를 #elif 매크로 호출에 사용할 수 있도록 명령에 상수 식.
전처리기의 지정 된 항목 중 하나를 선택 텍스트 추가 처리 합니다.지정 된 블록 텍스트 의 텍스트 구성 된 시퀀스입니다.이 두 개 이상 한 줄을 차지할 수 있습니다.일반적으로 텍스트 의미가 컴파일러 또는 전처리기 프로그램 텍스트입니다.
전처리기는 선택한 처리 텍스트 하 여 컴파일러에 전달 합니다.경우 텍스트 전처리기 지시문이 지시문은 전처리기 수행을 포함 합니다.전처리기에서 선택한 텍스트 블록만 컴파일됩니다.
전처리기는 하나의 선택 텍스트 항목에서 각 다음 상수 식을 계산 #if 또는 #elif 상수 식이 true (0이 아닌)을 찾을 때까지 지시문입니다.모든 텍스트를 선택 (시작 기타 전처리기 지시문을 포함 하 여 #)에 관련 #elif, #else, 또는 #endif.
경우 모두 상수 식 이 인수 하거나 없는 경우 #elif 를 텍스트 블록 이후에 선택 하는 전처리기 지시문의 #else 절.경우는 #else 절을 생략 및 모든 인스턴스를 상수 식 에 #if 블록이 거짓 된, 없음 텍스트 블록을 선택 합니다.
해당 상수 식 정수 상수 식을 사용 하 여 이러한 추가 제한 됩니다:
식이 정수 계열 형식이 있어야 합니다 및 문자 상수 정수 상수만 사용할 수 있습니다 하는 정의 된 연산자입니다.
식을 사용할 수 없습니다 sizeof 또는 형식 캐스트 연산자입니다.
대상 환경의 모든 범위의 정수를 나타낼 수 있습니다.
변환 유형을 나타내는 int 형식과 긴, 및 unsigned int 와 같은 unsigned long.
번역자는 문자 상수 집합을 다른 집합의 대상 환경에 대 한 코드 값을 변환할 수 있습니다.대상 환경의 등록 정보를 확인 하려면 한도에서 매크로의 값을 확인 하십시오.H을 대상 환경에 대해 작성 된 합니다.
식이 모든 환경적 조회를 수행 해야 합니다 및 구현 세부 사항에 있는 대상 컴퓨터 로부터 절연 상태를 유지 해야 합니다.
전처리기 연산자 정의 된 는 다음 구문에서와 같이 특별 한 상수 식에 사용할 수 있습니다.
defined( identifier )
정의identifier
것이 상수 식으로 간주 됩니다 true (0이 아닌 값) 하는 경우는 식별자 현재 정의입니다. 그렇지 않은 경우 조건이 false입니다 (0)입니다.텍스트를 빈 것으로 간주 되는 식별자를 정의 합니다.정의 지시문에서 사용할 수 있는 #if 하는 #elif 지시문을 되지만 다른 위치.
다음 예제에서는 #if 및 #endif 지시문 제어 컴파일하는 세 가지 함수 호출 중 하나:
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
함수 호출에 credit 경우 컴파일되는 식별자 CREDIT 정의 됩니다.경우 식별자 DEBIT 정의 된 함수 호출을 debit 컴파일됩니다.두 식별자가 정의 된 경우 호출을 printerror 컴파일됩니다.참고 CREDIT 및 credit 의 경우 서로 다르기 때문에 C 및 C++ 고유 식별자입니다.
다음 예제에서는 조건부 컴파일 문에서 라는 미리 정의 된 기호 상수 가정 DLEVEL.
#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
첫 번째 #if 두 가지 블록을 보여 줍니다 중첩 된 #if, #else, 및 #endif 지시문입니다.경우에 첫 번째 집합을 지시문 처리 됩니다 DLEVEL > 5 마찬가지입니다.그렇지 않으면 문을 후 #사람 처리 됩니다.
#elif 및 #else 지시문의 두 번째 예제에서는 값을 기준으로 하 여 4 개 중 하나를 확인 하는 데 사용 됩니다 DLEVEL.상수 STACK 0, 100, 200, 정의에 따라 설정 된 DLEVEL.경우 DLEVEL 5, 고 문을 보다 큽니다
#elif DLEVEL > 5
display(debugptr);
컴파일 및 STACK 정의 되지 않았습니다.
일반적으로 조건부 컴파일을 사용 동일한 헤더 파일을 여러 개 포함 되지 않도록 하는 것.여기서 클래스 종종 헤더 파일에 정의 된 C++의 여러 정의 방지 하기 위해 다음과 같은 구문은 사용할 수 있습니다.
/* EXAMPLE.H - Example header file */
#if !defined( EXAMPLE_H )
#define EXAMPLE_H
class Example
{
...
};
#endif // !defined( EXAMPLE_H )
앞의 코드 인지 확인 하는 기호화 된 상수 EXAMPLE_H 정의 됩니다.그렇다면 파일이 이미 포함 되어 있습니다 및 다시 처리 해야 합니다.상수, 경우 EXAMPLE_H 예제를 표시 하려면 정의 됩니다.H는 이미 처리 합니다.