包含源文件 (#include)
#include 指令用于将另一个文件的内容包含到源代码中。该指令执行的操作就相当于程序员将文本从包含文件复制到剪贴板并粘贴到当前文件中该指令位置。
编写复杂程序时,将源代码分成多个文件是一种常见的做法。这类程序建立在模块化的基础上,这样每个模块/文件包含解决一个或多个相关任务的逻辑相关代码。
包含文件也用于分发库(现成的算法集)。相同的库可以包含在不同的程序中。在这种情况下,库更新(其头文件的更新)将在下次编译时自动应用于所有程序。
如果 MQL 程序主文件必须具有 mq5 扩展名,那么包含文件的扩展名一般是 mqh(单词末尾的 h 代表 header)。同时,允许对其他类型的文本文件使用 #include 指令,例如 *.txt(见下文)。在任何情况下,当包含一个文件时,由 mq5 主文件和所有头文件组合而成的最终程序仍然必须是语法正确的。例如,将一个具有二进制信息的文件(如 png 图像)包含在内会破坏编译。
有两种类型的 #include 语句:
#include <file_name>
|
在第一类语句中,文件名用尖括号括起来。编译器在终端数据目录的 MQL5/Include/ 子文件夹中搜索此类文件。
在第二类语句中,文件名用引号括起来,则在包含使用 #include 语句的当前文件的同一目录中执行搜索。
无论是那种情况,文件都可以位于搜索目录的子文件夹中。此时,您应该在指令中的文件名之前指定文件夹的完整相对层次结构。例如,除了 MetaTrader 5 之外,还有许多常用的引导文件,包括 DateTime.mqh,它提供了一组处理日期和时间的方法(它们被设计为结构体,这是我们将在第三章 OOP 专题中讨论的语言构造)。DateTime.mqh 文件位于 Tools 文件夹中。要将它包含在源代码中,应该使用以下指令:
#include <Tools/DateTime.mqh> |
为了演示如何使用指令包含来自与源文件相同文件夹的头文件,让我们来分析 Preprocessor.mq5 文件。它包含以下指令:
#include "Preprocessor.mqh" |
它引用 Preprocessor.mqh 文件,该文件实际上位于 Preprocessor.mq5 的同级目录中。
反过来,包含文件也可以包含其他文件。具体来说,Preprocessor.mqh 内部有以下代码:
double array[] =
|
这意味着数组的内容是从给定的文本文件初始化的。如果我们查看 Preprocessor.txt,就会看到符合数组初始化语法规则的文本:
1, 2, 3, 4, 5 |
因此,可以从定制组件中收集源代码,包括使用其他程序生成源代码。
请注意,如果未找到指令中指定的文件,编译将会失败。
如果有多个文件,则包含顺序决定了预处理器指令的处理顺序。