条件编译 (#ifdef, #ifndef, #else, #endif)

编译器使用预处理程序指令在编译之前对源代码进行预处理。这个指令通常以#开始,因此编译器禁止在变量,函数等名称中使用符号。

每个指令都由一个单独的条目描述,并且在换行符之前都是有效的。在一个条目中不能使用多个指令。如果指令条目太大,可以使用'\'符号将其分隔成若干行。 在这种情况下,下一行被认为是指令条目的延续。

预处理条件编译指令允许根据某个条件的实现编译或跳过程序的一部分。

条件可以采取下列形式之一。

#ifdef identifier
   // 如果#define指令已经为预处理器定义标识符那么就会编译位于这里的代码。
#endif

#ifndef identifier
   // 如果#define预处理器指令当前没有定义标识符则编译位于这里的代码。
#endif

任何条件编译指令可以跟在任何行数之后可能包含#else指令并以#endif结束。如果验证条件是真的,#else和#endif之间的行即被忽略。如果验证条件不满足,所有检查和#else之间的指令(或#endif指令如果前者不在)即被忽略。

例如:

#ifndef TestMode
   #define TestMode
#endif
//+------------------------------------------------------------------+
//| 脚本程序开始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
   #ifdef TestMode
      Print("Test mode");
   #else
      Print("Normal mode");
   #endif
  }

根据程序类型和编译模式,按以下方式定义标准宏:

__MQL5__  macro在编译*.mq5文件时定义, __MQL4__ macro在编译*.mq4文件时定义。
_DEBUG macro 在debug模式编译时定义。
_RELEASE macro 在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
  }