Условная компиляция (#ifdef, #ifndef, #else, #endif)
Директивы условной компиляции препроцессора позволяют компилировать или пропускать часть программы в зависимости от выполнения некоторого условия.
Условие может принимать одну из описываемых ниже форм.
#ifdef identifier
// код, находящийся здесь, компилируется, если identifier уже был определен для препроцессора в команде #define.
#endif |
#ifndef identifier
// код, находящийся здесь, компилируется, если identifier в данный момент не определен командой препроцессора #define.
#endif |
За любой из команд условной компиляции может следовать произвольное число строк, содержащих, возможно, команду вида #else и заканчивающихся #endif. Если проверяемое условие справедливо, то строки между #else и #endif игнорируются. Если же проверяемое условие не выполняется, то игнорируются все строки между проверкой и командой #else, а если ее нет, то командой #endif.
Пример:
#ifndef TestMode
#define TestMode
#endif
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
#ifdef TestMode
Print("Test mode");
#else
Print("Normal mode");
#endif
} |
В зависимости от типа программы и режима компиляции стандартные макросы определяются следующим образом:
Макрос __MQL4__ доступен при компиляции файла *.mq4, при компиляции *.mq5 доступен макрос __MQL5__.
Макрос _DEBUG доступен при компиляции под отладку.
Макрос _RELEASE доступен при компиляции не под отладку.
Пример:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
#ifdef __MQL5__
#ifdef _DEBUG
Print("Hello from MQL5 compiler [DEBUG]");
#else
#ifdef _RELEASE
Print("Hello from MQL5 compiler [RELEASE]");
#endif
#endif
#else
#ifdef __MQL4__
#ifdef _DEBUG
Print("Hello from MQL4 compiler [DEBUG]");
#else
#ifdef _RELEASE
Print("Hello from MQL4 compiler [RELEASE]");
#endif
#endif
#endif
#endif
} |
|