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

条件编译指令允许你在编译过程中包含和排除代码片段。#ifdef#ifndef 指令标记由它们控制的代码片段的开始。该代码片段以 #endif 指令结束。#ifdef 语法的最简单形式如下:

#ifdef macro_identifier
  statements
#endif

如果使用 #define 在代码上方定义了具有指定标识符的宏,那么这个代码片段将参与编译。否则会将其排除。除了应用程序代码中定义的宏之外,环境中还提供了一组预定义的常量,特别是 _RELEASE 和 _DEBUG 标志(参见 预定义常量一节):也可以在条件编译指令中检查它们的名称。

扩展形式 #ifdef 允许指定两段代码:如果定义了宏标识符,将包含第一段代码,如果没有定义,将包含第二段代码。为此,在 #ifdef#endif 之间插入一个片段分隔符 #else

#ifdef macro_identifier
  statesments_true
#else
  statements_false
#endif

#ifndef 指令的工作方式相似,但是片段的包含和排除是按照相反的逻辑进行的:如果头文件中指定的宏没有定义,则编译第一个片段,如果定义了,则编译第二个片段。

例如,根据是否存在 DEMO 宏替换,我们可能会也可能不会调用函数以计算斐波那契数。

#ifdef DEMO
   Print("Fibo is disabled in the demo");
#else
   FillFibo();
#endif

在这种情况下,如果启用了 DEMO 模式,将在日志中显示一条消息,而不是调用函数,但是由于在 Preprocessor.mq5 脚本和所有包含文件中都没有 #define DEMO 定义,所以编译将根据分支 #else 进行,即对 FillFibo 函数的调用将进入可执行文件 ex5。

指令可以嵌套。

#ifdef _DEBUG
   Print("Debugging");
#else
   #ifdef _RELEASE
      Print("Normal run");
   #else
      Print("Undefined mode!");
   #endif
#endif