조건부 컴파일 (#ifdef, #ifndef, #else, #endif)

프리프로세서 명령문은 컴파일하기 전에 소스 코드를 전처리하는 데 사용됩니다. 명령문은 항상 #로 시작하므로 컴파일러는 변수, 함수 등의 이름에 기호를 사용할 수 없습니다.

각 명령문은 별도의 항목으로 설명되며 줄 바꿈까지 유효합니다. 한 항목에는 여러 명령문을 사용할 수 없습니다. 지시어 입력이 너무 크면 '\' 기호를 사용하여 여러 줄로 구분할 수 있습니다. 이 경우 다음 행은 명령문 입력의 연속으로 간주됩니다.

전처리기 조건부 컴파일 지침을 사용하면 특정 조건의 충족 여부에 따라 프로그램의 일부를 컴파일하거나 건너뛸 수 있습니다.

이 조건은 다음 포맷 중 하나를 사용할 수 있습니다.

#ifdef identifier
   // #preprocessor 지시어에 식별자가 이미 정의된 경우 여기에 있는 코드가 컴파일됩니다.
#endif

#ifndef identifier
   // 식별자가 현재 전처리기로 지시어로 #define 되지 않은 경우 여기에 있는 코드가 컴파일됩니다.
#endif

모든 조건부 컴파일 지시문은 #else 명령문을 포함하고 #endif로 끝나는 가능한 모든 줄의 뒤에 올 수 있습니다. 확인된 조건이 참이면 #else와 #endif 사이의 선이 무시됩니다. 확인된 조건이 충족되지 않으면 확인 및 #else 지시문(또는 전자가 없는 경우 #endif 지시문) 사이의 모든 줄이 무시됩니다.

예제:

#ifndef TestMode
   #define TestMode
#endif
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef TestMode
      Print("테스트 모드");
   #else
      Print("일반 모드");
   #endif
  }

프로그램 유형 및 컴파일 모드에 따라 표준 매크로는 다음과 같이 정의됩니다.

__MQL5__  매크로는 *.mq5 파일을 컴파일할 때 정의되며, __MQL4__ 매크로는 *.mq4 파일을 컴파일할 때 정의됩니다.
_DEBUG 매크로는 디버그 모드에서 컴파일할 때 정의됩니다.
_RELEASE 매크로는 릴리즈 모드에서 컴파일할 때 정의됩니다.

예제:

//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef __MQL5__
      #ifdef _DEBUG
         Print("Hello from MQL5 compiler [DEBUG]");
      #else
        #ifdef _RELEASE
           Print("Hello from MQL5 compiler [RELEASE]");
        #endif
     #endif
   #else
      #ifdef __MQL4__
         #ifdef _DEBUG
           Print("Hello from MQL4 compiler [DEBUG]");
        #else
           #ifdef _RELEASE
              Print("Hello from MQL4 compiler [RELEASE]");
           #endif
        #endif
     #endif
   #endif
  }