Включение исходных файлов (#include)

Директива #include предназначена для включения в исходный код содержимого другого, указанного в ней файла. Её действие эквивалентно тому, как если бы программист скопировал в буфер обмена текст из включаемого файла и вставил в то место текущего файла, где была директива.

Разделение исходных кодов на несколько файлов — обычная практика при написании сложных программ. Все они строятся по модульному принципу. В каждом модуле/файле содержится логически связанный код, решающий одну или несколько смежных задач.

Также включаемые файлы используются для распространения библиотек (наборов готовых алгоритмов). Одна и та же библиотека может быть включена в разные программы. При этом обновление библиотеки (её заголовочного файла) автоматически начнет работать во всех программах при их последующей компиляции.

Если основные файлы MQL-программ должны иметь расширение mq5, то для включаемых файлов существует общая практика давать им расширение mqh ('h' на конце от слова "header" — "заголовок"). Вместе с тем, допустимо использовать директиву #include и для других типов файлов с текстом, например, *.txt (см. далее). В любом случае, после включения другого файла не должна нарушаться синтаксическая правильность итоговой программы, объединенной из основного mq5-файла и всех заголовков. В частности, включение файла с двоичной информацией (например, png-изображения) приведет к нарушению компиляции.

Существует два вида инструкции #include:

#include <имя_файла>
#include "имя_файла"

В первой из них имя файла обрамляется угловыми скобками. Такие файлы компилятор ищет в каталоге данных терминала в подпаке MQL5/Include/.

Для второй из них, с именем в кавычках, поиск осуществляется в том же каталоге, где расположен текущий файл, в котором написана инструкция #include.

В обоих случаях файл может располагаться не прямо в каталоге поиска, а где-то во вложенных папках — тогда в директиве нужно указать всю относительную иерархию папок перед именем файла. Например, вместе с MetaTrader 5 поставляется множество общеупотребительных загрузочных файлов, среди которых есть DateTime.mqh с набором методов для работы с датой и временем (они оформлены в виде еще не изученной нами языковой конструкции — структуры, но здесь это и не важно: о структурах будет рассказано в Части 3, посвященной ООП). Файл DateTime.mqh расположен в папке Tools. Соответственно, чтобы включить его в свой исходный код, необходимо использовать следующую директиву:

#include <Tools/DateTime.mqh>

Для демонстрации включения заголовочного файла из той же папки, где лежит исходный файл с директивой, рассмотрим файл Preprocessor.mq5. В нем имеется директива:

#include "Preprocessor.mqh"

Она ссылается на файл Preprocessor.mqh, который действительно находится рядом с Preprocessor.mq5.

Включаемый файл может, в свою очередь, подключать другие файлы. В частности, внутри Preprocessor.mqh находится такой код:

double array[] =
{
   #include "Preprocessor.txt"
};

Он означает, что содержимое массива инициализируется из заданного текстового файла. Если заглянуть в Preprocessor.txt, мы увидим текст, отвечающий синтаксическим правилам инициализации массива:

1, 2, 3, 4, 5

Таким образом, существует возможность собирать исходный код из настраиваемых компонентов, в том числе, генерировать с помощью других программ.

Обратите внимание: если файл, указанный в директиве, не найден, компиляция закончится ошибкой.

Последовательность подключения нескольких файлов определяет порядок, в котором обрабатываются находящиеся в них директивы препроцессора.