Фишка для проекта с большим количеством файлов

 

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

#include <MyFolder\MyClass.mqh>

И иногда происходит такая ситуация - когда .mqh фалов много и возникают множественные #include одного и того же файла, компиляция проходит на ура, без варнингов, а при запуске советника мы имеем веселое сообщение "invalid EXT4 file (8)". Причем часто бывает достаточно поменять включаемые файлы местами и ошибка runtime исчезает. То есть, имеет место быть некая трудновоспроизводимая ошибка компилятора или среды исполнения (у меня за все время такое было всего 2 раза).

Я вспомнил один старый прием, который Microsoft практиковала в ранних версия студии и теперь все свои .mqh оформляю, как в коде ниже. Пока, тьфу-тьфу, на эту бяку не напарывался. Смысл в том, что TradeButtons.mqh будет гарантированно включаться в проект только один раз. Не уверен, что проблема в этом, но лишняя защита не повредит.

#ifndef TradeButtons
#define TradeButtons

//+------------------------------------------------------------------+
//|                                                 TradeButtons.mqh |
//|                                               Alexey Volchanskiy |

***** далее код класса******

#endif


 

В моем проекте более сотни файлов. Все классы оформлены в парах .mqh - .mq5, никогда указанной ошибки не возникало.

У меня гораздо чаще возникает ошибка с перекрестными ссылками, когда два класса используют один другой, и получается, что объявление одного класса должно идти перед объявлением второго, а объявление второго - перед объявлением первого. Частично решает проблему предварительное объявление (forward declaration), однако, все равно, нередко бывает даже с этим предварительным объявлением выскакивает ошибка "неизвестного класса", которая также исправляется при изменении порядка включения файлов в проект.

А "define-скобки" я поначалу использовал, просто, по инерции и по аналогии со своими наработками в кодировании, но понял, что и без них вроде нормально работает.

 
George Merts:

В моем проекте более сотни файлов. Все классы оформлены в парах .mqh - .mq5, никогда указанной ошибки не возникало.

У меня гораздо чаще возникает ошибка с перекрестными ссылками, когда два класса используют один другой, и получается, что объявление одного класса должно идти перед объявлением второго, а объявление второго - перед объявлением первого. Частично решает проблему предварительное объявление (forward declaration), однако, все равно, нередко бывает даже с этим предварительным объявлением выскакивает ошибка "неизвестного класса", которая также исправляется при изменении порядка включения файлов в проект.

Если по форуму поиском набрать "invalid EXT4 file (8)", будет немало сообщений об этой ошибке. У меня MQL4, а не пятерка, как у вас, и весь класс с методами я кладу в один .mqh.
 
Alexey Volchanskiy:
Если по форуму поиском набрать "invalid EXT4 file (8)", будет немало сообщений об этой ошибке. У меня MQL4, а не пятерка, как у вас, и весь класс с методами я кладу в один .mqh.

Не, я не спорю, у меня тоже такая ошибка иногда возникала, и на МТ4 и на МТ5 (я отлаживаю и тестирую советники и индикаторы в МТ5, а использую в МТ4). Но это, насколько я понимаю, не было связано с переобъявлением классов.  

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

 
George Merts:

Не, я не спорю, у меня тоже такая ошибка иногда возникала, и на МТ4 и на МТ5 (я отлаживаю и тестирую советники и индикаторы в МТ5, а использую в МТ4). Но это, насколько я понимаю, не было связано с переобъявлением классов.  

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

С этой ошибкой все непонятно, меня ребята из сервисдеска просили прислать скомпилированный файл с этой ошибкой, так и молчат. Насчет классов - чисто мое предположение, не более.
Причина обращения: