预处理器
到目前为止,我们一直在研究 MQL5 编程,假设源代码由编译器处理,编译器将其文本表示转换为二进制(可以由终端执行)。然而第一个工具是预处理器,它负责读取源代码并在必要时转换。MetaEditor 中内置的这个实用程序由直接插入源代码的特殊指令控制。它可以解决程序员在编写源代码时面临的许多问题。
与 C++ 预处理器类似,MQL5 支持宏替换的定义 (#define)、条件编译 (#ifdef) 和包含其他源文件 (#include )。在本章中,我们将探索这些能力。与 C++ 相比,其中一些预处理器存在一定的局限性。
除了标准指令之外,MQL5 预处理器还有自己特定的指令,特别是一组 MQL 程序特性 (#property),以及从独立 EX5 和 DLL 导入函数的指令 (#import)。我们将在第五、六和七章研究各种类型的 MQL 程序时讨论这些问题。
所有预处理器指令都以散列符号 # 开头,后跟一个关键字和附加参数,具体语法取决于指令的类型。
建议将预处理器指令作为一行的开头,或者至少在空格缩进之后开始(如果是嵌套指令)。在源代码语句中插入指令被认为是一种不良编程风格(与 MQL5 不同,C++ 预处理器根本不允许这样做)。
预处理器指令不是语言语句,不应以 ; 结束。指令通常延续到当前代码行的结尾。在某些情况下,它们可以以特殊的方式扩展到后面的代码行(这方面的内容将单独讨论)。
指令按照它们在文本中出现的顺序执行,并考虑前面指令的处理情况。例如,如果使用 #include 指令将两个文件连接,并且在被包含的文件中使用 #define 定义了一条替换规则,那么该规则将对后续所有代码行生效,包括后续包含的头文件中的代码。
预处理器不会处理注释。