Библиотеки: Price_Compare - страница 3

 
Koldun Zloy:

Вы не сможете это обосновать.

Примеров может быть много. Например, этот.

Init_Sync
Init_Sync
  • www.mql5.com
Если в MT изменить таймфрейм или имя символа чарта, то все индикаторы на чарте выгрузятся с чарта и загрузятся на него снова. При этом, в отличие от MT4, в MT5 последовательность выгрузиться/загрузиться не определена из-за особенности внутренней архитектуры. Данное обстоятельство иногда вызывает не сразу очевидные проблемы, связанные с тем, что...
 

Это не обоснование.

Ваши примеры я видел.

Их все можно переписать без макросов.

 
Koldun Zloy:

Это не обоснование.

Ваши примеры я видел.

Их все можно переписать без макросов.

Ну так попробуйте добиться такого эффекта

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Init_Sync

fxsaber, 2017.04.18 07:52

библиотека, когда #include есть, но нигде в коде ничего из нее не вызывается пользователем.

 
Какого конкретно?
Я не хочу разбираться в этих портянках кода.
Я достаточно имел дело с макросами в сишных библиотеках и ни какого чуда от них не жду.
Вы уж, будьте добры, приведите короткий пример, демонстрирующий необходимость макросов.
Если Вы помните, когда я Вам рассказывал про умные указатели и синглтон, я приводил примеры,
в которых не было ничего лишнего.

 
Koldun Zloy:
Какого конкретно?
Я не хочу разбираться в этих портянках кода.

Вам по-русски был сформулирован эффект, код смотреть не нужно.


Что же касается "замены" макросов, то такое же утверждение можно применить к шаблонам, ООП и прочее. Т.к. C++ написан на Асме.

Например, можно всегда заменить копи-пасту текста на его набор. Вопрос лишь в удобстве. Писать на Асме или C++ - аналогично.


Свое отношение к макросам сформулировал. Кратко - удобно.

 
библиотека, когда #include есть, но нигде в коде ничего из нее не вызывается пользователем.

Даже в голову не пришло, что этот эффект хоть сколько-то нужен.

Что же касается "замены" макросов, то такое же утверждение можно применить к шаблонам, ООП и прочее. Т.к. C++ написан на Асме.

Например, можно всегда заменить копи-пасту текста на его набор. Вопрос лишь в удобстве. Писать на Асме или C++ - аналогично.


Свое отношение к макросам сформулировал. Кратко - удобно.

ООП и шаблоны безопаснее макросов.

А удобно это Вам, пока Вам не приходится работать с чужими макросами.

 
Koldun Zloy:

Даже в голову не пришло, что этот эффект хоть сколько-то нужен.

К сожалению, он востребован.


ООП и шаблоны безопаснее макросов.

А удобно это Вам, пока Вам не приходится работать с чужими макросами.

Что здесь опасного?

#ifdef __MQL5__
  #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
  
  #define TICKET_TYPE int
  #define MAGIC_TYPE  int
#else 
  #define TICKET_TYPE long
  #define MAGIC_TYPE  long
#endif

Правило использования любого макроса всегда одно: используй, когда понимаешь.

 

Допустим. И какая тут роль именно макросов?

Что здесь опасного?

#ifdef __MQL5__
  #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
  
  #define TICKET_TYPE int
  #define MAGIC_TYPE  int
#else 
  #define TICKET_TYPE long
  #define MAGIC_TYPE  long
#endif

Здесь это необходимость, так как typedef в MQL работает только с указателями на функцию.

Все опасности перечислю позже.

 
Koldun Zloy:

Допустим. И какая тут роль именно макросов?

void OnTick() // Подстава
{
  Print("Hello World!");
  
  ::OnTick2();
}

#define OnTick OnTick2

void OnTick() {} // Оригинальный
 

Это всё баловство. Не так трудно вставить необходимый код в функцию.

Вы фактически скрываете от пользователя библиотеки, что в функцию добавляется какой-то код.

Если Вам придётся разбираться с такими трюками в чужой программе, Вы проклянёте автора.


А вот пример неправильного использования макросов в Вашей библиотеке:

#define CHECK_INIT_SYNC if (INIT_SYNC::Check()) return

void OnTimer( void )
{
  CHECK_INIT_SYNC;

  ::OldOnTimer();
}

Этот макрос скрывает, что в этом месте может быть выход из функции.

Для чего он нужен вообще? Ради копеечной экономии букв? Это несерьёзно.


Допустимо использовать макросы для условной компиляции и для объявления типа (пока нет нормального typedef).

Ещё иногда приходится объявлять константы при помощи макросов.

Во всех остальных случаях макросы только запутывают код.

Вот яркий пример запутывания: https://www.mql5.com/ru/forum/170952/page50#comment_5488178

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2017.07.20
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...