Макросы __MQL4__ и __MQL5__ : как использовать в переносимом коде ?

 

Приветствую.

Есть задача - писать код так, чтобы он без изменений компилировался как на МТ4 так и на МТ5.

Поскольку терминалы работают по-разному, а кроме того, Стандартная Библиотека имеет существенные отличия на МТ4 и МТ5 даже в структуре таких базовых классов, как таймсерии - необходимо, чтобы в коде были фрагменты, которые отдельно компилируются для МТ4 и для МТ5.


Мне казалось, что задача с появлением макросов #ifdef,  __MQL4__ и __MQL5__  - решается запросто. 

Пишем конструкцию типа:

#ifdef  __MT5__

...

// код для МТ5

...

#else

...

// код для МТ4

...

#endif


И в результате МТ5 - будет воспринимать свой участок кода, МТ4 - свой.

Но, оказывается, все не так просто.  Если .MQ5 модуль перенести без изменений в МТ4 - то все равно будет компилирован участок для МТ5. При этом если тот же модуль переименовать в .MQ4 - начнет выполняться код для МТ4.

Похоже, (как я понял), макросы __МТ5__ и __МТ4__ показывают не тип терминала, а тип компилируемого модуля - то есть, просто его расширение.

В документации также описаны макросы __MT4BUILD__ и __MT5BUILD__ - но они оба определены в новом МТ4.

Как же определить в момент компиляции, на каком терминале - МТ4 или МТ5 идет компиляция ?

 

Вы перенесли mq5 файл без смены расширения в МТ4?

чтобы скомпилировать под MQL4, надо сменить расширение. 

 
Renat:

Вы перенесли mq5 файл без смены расширения в МТ4?

чтобы скомпилировать под MQL4, надо сменить расширение. 

Понятно. Но, вроде как библиотеки компилируются и без замены расширения.

Моя "сверхзадача" - сделать единую библиотеку, которая бы без изменений работала и на МТ5, где у меня уже много оттестированных классов, и на МТ4, где я только начинаю работать. Как раз макросы __МТ5__ и __МТ4__ - здорово помогли. Фактически, я сделал файл с классами таймсерий, который совершенно без изменений компилируется (пока не проверял на запуск, но компиляция - уже неплохо) и на МТ4 и на МТ5, при этом на МТ5 - используются только классы Стандартной Библиотеки,  а на МТ4 - там, где есть аналоги, используются также классы Стандартной Библиотеки, а там, где их нет - используются самописные классы с аналогичной функциональностью.

Единственная загвоздка - сейчас приходится использовать не очень-то правильную  конструкцию:

  #ifdef DEFAULT_BUFFER_SIZE

учитывая, что макрос DEFAULT_BUFFER_SIZE - определен только в СБ от МТ5, а в СБ от МТ4 его нет (пока ?).

Но хотелось бы, конечно, более нормального дефайна, который зависит от реальной платформы, а не от расширения компилируемого файла. Тем более, что, скажем, у файлов MQH - расширение вобще одинаково как для МТ4, так и для МТ5. А большинство моих классов лежит в библиотеках - заголовки в MQH и имплементация в MQ5.

 
Вы можете все рабочие файлы держать в MQH, а иметь только разные стартовые mq4 и mq5 файлы.
 
Renat:
Вы можете все рабочие файлы держать в MQH, а иметь только разные стартовые mq4 и mq5 файлы.

Хм... Да, это тоже мысль.

Надо все файлы по-прежнему держать в .MQ5, но при этом иметь один файл .MQ4, включающий в себя всю библиотеку - и одним этим файлом ее полностью перекомпилировать.

Причина обращения: