Препроцессор

До сих пор мы изучали программирование на MQL5, подразумевая, что исходные коды обрабатываются компилятором, который преобразует их текстовое представление в двоичное (исполняемое терминалом). Однако первым инструментом, который читает и, при необходимости, преобразует исходные коды, является препроцессор. Эта встроенная в MetaEditor утилита управляется специальными директивами, вставленными непосредственно в исходный код, и позволяет решать целый ряд задач, с которыми сталкиваются программисты при подготовке исходных кодов.

По аналогии с препроцессором C++, MQL5 поддерживает определение макроподстановок (#define), условную компиляцию (#ifdef) и подключение других исходных файлов (#include). В данной главе мы рассмотрим эти возможности. В некоторых из них имеются ограничения по сравнению с C++.

Помимо стандартных директив препроцессор MQL5 имеет свои специфические, в частности, набор свойств MQL-программы (#property) и импорт функций из обособленных библиотек форматов EX5 и DLL (#import). К ним мы обратимся в пятой, шестой и седьмой Частях при изучении различных типов MQL-программ.

Все директивы препроцессора начинаются с символа решетки '#', за которым следует ключевое слово и дополнительные параметры, синтаксис которых зависит от типа директивы.

Рекомендуется начинать директиву препроцессора с самого начала строки или, по крайней мере, после отступа из пробельных символов (если директивы вложенные). Вставлять директиву внутрь инструкций исходного кода считается плохим стилем программирования (в отличие от MQL5 препроцессор C++ этого вовсе не позволяет).

Директивы препроцессора не являются инструкциями языка, их не следует завершать символом ';'. Директивы обычно продолжаются до конца текущей строки. В некоторых случаях их можно особым образом продлевать на следующие строки, о чем будет сказано отдельно.

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

Комментарии препроцессором не обрабатываются.